Changeset 156532 in webkit


Ignore:
Timestamp:
Sep 27, 2013 2:44:20 AM (11 years ago)
Author:
mario@webkit.org
Message:

[ATK] Protect entry points in the ATK wrapper against outdated render trees
https://bugs.webkit.org/show_bug.cgi?id=121558

Reviewed by Chris Fleizach.

Source/WebCore:

Make sure that we protect every entry point in the ATK wrapper
against outdated render trees, before using the WebCore's
accessibility API, since that might lead to problems (and crashes)
if the render and accessibility trees are not stable.

Thus, call AccessibilityObject::updateBackingStore() in those
entry points and check whether the ATK wrapper is detached or not
after that, to decide whether to continue or not.

Besides providing a new test to check that it WebKit does not
crash in a given scenario (which actually triggered the
investigation here), solving this situation also fixes other tests
that were previously failing (aria-used-on-image-maps.html) or
that were printing wrong results, not detected until now due to
wrong platform specific expectations (file-upload-button-stringvalue
and deleting-iframe-destroys-axcache).

Test: accessibility/heading-crash-after-hidden.html

  • accessibility/atk/WebKitAccessibleUtil.h: Added two new macros

to inject the needed code at the beginning of each entry point to
allow gracefully exit those functions when the render tree is
unstable. Inspired by g_return_if_fail and g_return_val_if_fail, we
called them returnIfWebKitAccessibleIsInvalid and returnValIfWebKitAccessibleIsInvalid.

  • accessibility/atk/WebKitAccessibleHyperlink.cpp:

(webkitAccessibleHyperlinkActionDoAction): Protect entry point.
(webkitAccessibleHyperlinkActionGetNActions): Ditto.
(webkitAccessibleHyperlinkActionGetDescription): Ditto.
(webkitAccessibleHyperlinkActionGetKeybinding): Ditto.
(webkitAccessibleHyperlinkActionGetName): Ditto.
(webkitAccessibleHyperlinkGetURI): Ditto.
(webkitAccessibleHyperlinkGetObject): Ditto.
(webkitAccessibleHyperlinkGetStartIndex): Ditto.
(webkitAccessibleHyperlinkGetEndIndex): Ditto.
(webkitAccessibleHyperlinkIsValid): Ditto.
(webkitAccessibleHyperlinkGetNAnchors): Ditto.
(webkitAccessibleHyperlinkIsSelectedLink): Ditto.

  • accessibility/atk/WebKitAccessibleInterfaceAction.cpp:

(webkitAccessibleActionDoAction): Ditto.
(webkitAccessibleActionGetNActions): Ditto.
(webkitAccessibleActionGetDescription): Ditto.
(webkitAccessibleActionGetKeybinding): Ditto.
(webkitAccessibleActionGetName): Ditto.

  • accessibility/atk/WebKitAccessibleInterfaceComponent.cpp:

(webkitAccessibleComponentRefAccessibleAtPoint): Ditto.
(webkitAccessibleComponentGetExtents): Ditto.
(webkitAccessibleComponentGrabFocus): Ditto.

  • accessibility/atk/WebKitAccessibleInterfaceDocument.cpp:

(webkitAccessibleDocumentGetAttributeValue): Ditto.
(webkitAccessibleDocumentGetAttributes): Ditto.
(webkitAccessibleDocumentGetLocale): Ditto.

  • accessibility/atk/WebKitAccessibleInterfaceEditableText.cpp:

(webkitAccessibleEditableTextSetRunAttributes): Ditto.
(webkitAccessibleEditableTextSetTextContents): Ditto.
(webkitAccessibleEditableTextInsertText): Ditto.
(webkitAccessibleEditableTextCopyText): Ditto.
(webkitAccessibleEditableTextCutText): Ditto.
(webkitAccessibleEditableTextDeleteText): Ditto.
(webkitAccessibleEditableTextPasteText): Ditto.

  • accessibility/atk/WebKitAccessibleInterfaceHypertext.cpp:

(webkitAccessibleHypertextGetLink): Ditto.
(webkitAccessibleHypertextGetNLinks): Ditto.
(webkitAccessibleHypertextGetLinkIndex): Ditto.

  • accessibility/atk/WebKitAccessibleInterfaceImage.cpp:

(webkitAccessibleImageGetImagePosition): Ditto.
(webkitAccessibleImageGetImageDescription): Ditto.
(webkitAccessibleImageGetImageSize): Ditto.

  • accessibility/atk/WebKitAccessibleInterfaceSelection.cpp:

(webkitAccessibleSelectionAddSelection): Ditto.
(webkitAccessibleSelectionClearSelection): Ditto.
(webkitAccessibleSelectionRefSelection): Ditto.
(webkitAccessibleSelectionGetSelectionCount): Ditto.
(webkitAccessibleSelectionIsChildSelected): Ditto.
(webkitAccessibleSelectionRemoveSelection): Ditto.
(webkitAccessibleSelectionSelectAllSelection): Ditto.

  • accessibility/atk/WebKitAccessibleInterfaceTable.cpp:

(webkitAccessibleTableRefAt): Ditto.
(webkitAccessibleTableGetIndexAt): Ditto.
(webkitAccessibleTableGetColumnAtIndex): Ditto.
(webkitAccessibleTableGetRowAtIndex): Ditto.
(webkitAccessibleTableGetNColumns): Ditto.
(webkitAccessibleTableGetNRows): Ditto.
(webkitAccessibleTableGetColumnExtentAt): Ditto.
(webkitAccessibleTableGetRowExtentAt): Ditto.
(webkitAccessibleTableGetColumnHeader): Ditto.
(webkitAccessibleTableGetRowHeader): Ditto.
(webkitAccessibleTableGetCaption): Ditto.
(webkitAccessibleTableGetColumnDescription): Ditto.
(webkitAccessibleTableGetRowDescription): Ditto.

  • accessibility/atk/WebKitAccessibleInterfaceText.cpp:

(webkitAccessibleTextGetText): Ditto.
(webkitAccessibleTextGetTextAfterOffset): Ditto.
(webkitAccessibleTextGetTextAtOffset): Ditto.
(webkitAccessibleTextGetTextBeforeOffset): Ditto.
(webkitAccessibleTextGetCharacterAtOffset): Ditto.
(webkitAccessibleTextGetCaretOffset): Ditto.
(webkitAccessibleTextGetRunAttributes): Ditto.
(webkitAccessibleTextGetDefaultAttributes): Ditto.
(webkitAccessibleTextGetCharacterExtents): Ditto.
(webkitAccessibleTextGetRangeExtents): Ditto.
(webkitAccessibleTextGetCharacterCount): Ditto.
(webkitAccessibleTextGetOffsetAtPoint): Ditto.
(webkitAccessibleTextGetNSelections): Ditto.
(webkitAccessibleTextGetSelection): Ditto.
(webkitAccessibleTextAddSelection): Ditto.
(webkitAccessibleTextSetSelection): Ditto.
(webkitAccessibleTextRemoveSelection): Ditto.
(webkitAccessibleTextSetCaretOffset): Ditto.

  • accessibility/atk/WebKitAccessibleInterfaceValue.cpp:

(webkitAccessibleValueGetCurrentValue): Ditto.
(webkitAccessibleValueGetMaximumValue): Ditto.
(webkitAccessibleValueGetMinimumValue): Ditto.
(webkitAccessibleValueSetCurrentValue): Ditto.
(webkitAccessibleValueGetMinimumIncrement): Ditto.

  • accessibility/atk/WebKitAccessibleWrapperAtk.cpp:

(core): Removed, as it's not actually needed.
(webkitAccessibleGetName): Protect entry point.
(webkitAccessibleGetDescription): Ditto.
(webkitAccessibleGetParent): Ditto.
(webkitAccessibleGetNChildren): Ditto.
(webkitAccessibleRefChild): Ditto.
(webkitAccessibleGetIndexInParent): Ditto.
(webkitAccessibleGetAttributes): Ditto.
(webkitAccessibleGetRole): Ditto.
(webkitAccessibleRefStateSet): Ditto.
(webkitAccessibleRefRelationSet): Ditto.
(webkitAccessibleGetObjectLocale): Ditto.
(webkitAccessibleDetach): Ditto.
(webkitAccessibleIsDetached): New helper function, to be used from
the newly added macros. We need to check whether the wrapper is
detached and not just the wrapper AccessibilityObject since once
the detachment happens we can't trust anything but the AtkObject
from the wrapper (the AccessibilityObject might be invalid).

  • accessibility/atk/WebKitAccessibleWrapperAtk.h:

Assert that the render tree is neither being updated nor in need
of being updated before trying to compute the text under a given
element, since that might lead to crashes due to the constructor
of TextIterator calling updateLayoutIgnorePendingStylesheets().

  • accessibility/AccessibilityNodeObject.cpp:

(WebCore::AccessibilityNodeObject::textUnderElement): Assert that
the render tree is neither being updated nor needing updating.

LayoutTests:

Added a new test to check that we do not crash in certain
scenarios when hiding objects and retriving accessibility
information about it.

  • accessibility/heading-crash-after-hidden-expected.txt: Added.
  • accessibility/heading-crash-after-hidden.html: Added.

Rebaselined expectations that were wrong before, since they were
not returning the actual value that they should be returning when
called AccessibilityUIElement::stringValue().

  • platform/efl-wk1/accessibility/file-upload-button-stringvalue-expected.txt:

Updated, since the actual text being returned should be the actual
value of the file chooser (e.g. "(None)") and not the text in the
upload botton (e.g. "Choose files").

  • platform/efl-wk2/accessibility/file-upload-button-stringvalue-expected.txt: Ditto.
  • platform/gtk-wk2/accessibility/file-upload-button-stringvalue-expected.txt: Ditto..
  • platform/gtk/accessibility/file-upload-button-stringvalue-expected.txt: Ditto.
  • platform/gtk/accessibility/deleting-iframe-destroys-axcache-expected.txt:

Updated, since the iframe should be exposed at all after deleting it.

Removed accesibility test now passing after fixing this issue.

  • platform/gtk/TestExpectations: Removed accessibility/aria-used-on-image-maps.html.
Location:
trunk
Files:
2 added
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r156527 r156532  
     12013-09-27  Mario Sanchez Prada  <mario.prada@samsung.com>
     2
     3        [ATK] Protect entry points in the ATK wrapper against outdated render trees
     4        https://bugs.webkit.org/show_bug.cgi?id=121558
     5
     6        Reviewed by Chris Fleizach.
     7
     8        Added a new test to check that we do not crash in certain
     9        scenarios when hiding objects and retriving accessibility
     10        information about it.
     11
     12        * accessibility/heading-crash-after-hidden-expected.txt: Added.
     13        * accessibility/heading-crash-after-hidden.html: Added.
     14
     15        Rebaselined expectations that were wrong before, since they were
     16        not returning the actual value that they should be returning when
     17        called AccessibilityUIElement::stringValue().
     18
     19        * platform/efl-wk1/accessibility/file-upload-button-stringvalue-expected.txt:
     20        Updated, since the actual text being returned should be the actual
     21        value of the file chooser (e.g. "(None)") and not the text in the
     22        upload botton (e.g. "Choose files").
     23        * platform/efl-wk2/accessibility/file-upload-button-stringvalue-expected.txt: Ditto.
     24        * platform/gtk-wk2/accessibility/file-upload-button-stringvalue-expected.txt: Ditto..
     25        * platform/gtk/accessibility/file-upload-button-stringvalue-expected.txt: Ditto.
     26
     27        * platform/gtk/accessibility/deleting-iframe-destroys-axcache-expected.txt:
     28        Updated, since the iframe should be exposed at all after deleting it.
     29
     30        Removed accesibility test now passing after fixing this issue.
     31
     32        * platform/gtk/TestExpectations: Removed accessibility/aria-used-on-image-maps.html.
     33
    1342013-09-26  Antti Koivisto  <antti@apple.com>
    235
  • trunk/LayoutTests/platform/efl-wk1/accessibility/file-upload-button-stringvalue-expected.txt

    r154684 r156532  
    44
    55Default value (no files selected):
    6 accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: Choose File
    7 accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: Choose Files
     6accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: (None)
     7accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: (None)
    88
    99Drag and drop a single file:
  • trunk/LayoutTests/platform/efl-wk2/accessibility/file-upload-button-stringvalue-expected.txt

    r154684 r156532  
    44
    55Default value (no files selected):
    6 accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: Choose File
    7 accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: Choose Files
     6accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: (None)
     7accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: (None)
    88
    99Drag and drop a single file:
    10 accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: Choose File
    11 accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: Choose Files
     10accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: (None)
     11accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: (None)
    1212
    1313Drag and drop two files:
    14 accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: Choose File
    15 accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: Choose Files
     14accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: (None)
     15accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: (None)
    1616
  • trunk/LayoutTests/platform/gtk-wk2/accessibility/file-upload-button-stringvalue-expected.txt

    r154359 r156532  
    44
    55Default value (no files selected):
    6 accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: Choose File
    7 accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: Choose Files
     6accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: (None)
     7accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: (None)
    88
    99Drag and drop a single file:
    10 accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: Choose File
    11 accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: Choose Files
     10accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: (None)
     11accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: (None)
    1212
    1313Drag and drop two files:
    14 accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: Choose File
    15 accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: Choose Files
     14accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: (None)
     15accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: (None)
    1616
  • trunk/LayoutTests/platform/gtk/TestExpectations

    r156460 r156532  
    850850webkit.org/b/98357 accessibility/aria-readonly.html [ Failure ]
    851851webkit.org/b/98359 accessibility/aria-text-role.html [ Failure ]
    852 webkit.org/b/98360 accessibility/aria-used-on-image-maps.html [ Failure ]
    853852webkit.org/b/98361 accessibility/button-press-action.html [ Failure ]
    854853webkit.org/b/98363 accessibility/canvas-fallback-content-2.html [ Failure ]
  • trunk/LayoutTests/platform/gtk/accessibility/deleting-iframe-destroys-axcache-expected.txt

    r131674 r156532  
    2727    AXRole: AXWebArea
    2828        AXRole: AXParagraph AXValue: Before
    29         AXRole: AXGroup AXValue:
    3029        AXRole: AXParagraph AXValue: After
    3130        AXRole: AXParagraph AXValue: End of test
  • trunk/LayoutTests/platform/gtk/accessibility/file-upload-button-stringvalue-expected.txt

    r154359 r156532  
    44
    55Default value (no files selected):
    6 accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: Choose File
    7 accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: Choose Files
     6accessibilityController.accessibleElementById("singleFileUpload").stringValue: AXValue: (None)
     7accessibilityController.accessibleElementById("multipleFileUpload").stringValue: AXValue: (None)
    88
    99Drag and drop a single file:
  • trunk/Source/WebCore/ChangeLog

    r156530 r156532  
     12013-09-27  Mario Sanchez Prada  <mario.prada@samsung.com>
     2
     3        [ATK] Protect entry points in the ATK wrapper against outdated render trees
     4        https://bugs.webkit.org/show_bug.cgi?id=121558
     5
     6        Reviewed by Chris Fleizach.
     7
     8        Make sure that we protect every entry point in the ATK wrapper
     9        against outdated render trees, before using the WebCore's
     10        accessibility API, since that might lead to problems (and crashes)
     11        if the render and accessibility trees are not stable.
     12
     13        Thus, call AccessibilityObject::updateBackingStore() in those
     14        entry points and check whether the ATK wrapper is detached or not
     15        after that, to decide whether to continue or not.
     16
     17        Besides providing a new test to check that it WebKit does not
     18        crash in a given scenario (which actually triggered the
     19        investigation here), solving this situation also fixes other tests
     20        that were previously failing (aria-used-on-image-maps.html) or
     21        that were printing wrong results, not detected until now due to
     22        wrong platform specific expectations (file-upload-button-stringvalue
     23        and deleting-iframe-destroys-axcache).
     24
     25        Test: accessibility/heading-crash-after-hidden.html
     26
     27        * accessibility/atk/WebKitAccessibleUtil.h: Added two new macros
     28        to inject the needed code at the beginning of each entry point to
     29        allow gracefully exit those functions when the render tree is
     30        unstable. Inspired by g_return_if_fail and g_return_val_if_fail, we
     31        called them returnIfWebKitAccessibleIsInvalid and returnValIfWebKitAccessibleIsInvalid.
     32
     33        * accessibility/atk/WebKitAccessibleHyperlink.cpp:
     34        (webkitAccessibleHyperlinkActionDoAction): Protect entry point.
     35        (webkitAccessibleHyperlinkActionGetNActions): Ditto.
     36        (webkitAccessibleHyperlinkActionGetDescription): Ditto.
     37        (webkitAccessibleHyperlinkActionGetKeybinding): Ditto.
     38        (webkitAccessibleHyperlinkActionGetName): Ditto.
     39        (webkitAccessibleHyperlinkGetURI): Ditto.
     40        (webkitAccessibleHyperlinkGetObject): Ditto.
     41        (webkitAccessibleHyperlinkGetStartIndex): Ditto.
     42        (webkitAccessibleHyperlinkGetEndIndex): Ditto.
     43        (webkitAccessibleHyperlinkIsValid): Ditto.
     44        (webkitAccessibleHyperlinkGetNAnchors): Ditto.
     45        (webkitAccessibleHyperlinkIsSelectedLink): Ditto.
     46        * accessibility/atk/WebKitAccessibleInterfaceAction.cpp:
     47        (webkitAccessibleActionDoAction): Ditto.
     48        (webkitAccessibleActionGetNActions): Ditto.
     49        (webkitAccessibleActionGetDescription): Ditto.
     50        (webkitAccessibleActionGetKeybinding): Ditto.
     51        (webkitAccessibleActionGetName): Ditto.
     52        * accessibility/atk/WebKitAccessibleInterfaceComponent.cpp:
     53        (webkitAccessibleComponentRefAccessibleAtPoint): Ditto.
     54        (webkitAccessibleComponentGetExtents): Ditto.
     55        (webkitAccessibleComponentGrabFocus): Ditto.
     56        * accessibility/atk/WebKitAccessibleInterfaceDocument.cpp:
     57        (webkitAccessibleDocumentGetAttributeValue): Ditto.
     58        (webkitAccessibleDocumentGetAttributes): Ditto.
     59        (webkitAccessibleDocumentGetLocale): Ditto.
     60        * accessibility/atk/WebKitAccessibleInterfaceEditableText.cpp:
     61        (webkitAccessibleEditableTextSetRunAttributes): Ditto.
     62        (webkitAccessibleEditableTextSetTextContents): Ditto.
     63        (webkitAccessibleEditableTextInsertText): Ditto.
     64        (webkitAccessibleEditableTextCopyText): Ditto.
     65        (webkitAccessibleEditableTextCutText): Ditto.
     66        (webkitAccessibleEditableTextDeleteText): Ditto.
     67        (webkitAccessibleEditableTextPasteText): Ditto.
     68        * accessibility/atk/WebKitAccessibleInterfaceHypertext.cpp:
     69        (webkitAccessibleHypertextGetLink): Ditto.
     70        (webkitAccessibleHypertextGetNLinks): Ditto.
     71        (webkitAccessibleHypertextGetLinkIndex): Ditto.
     72        * accessibility/atk/WebKitAccessibleInterfaceImage.cpp:
     73        (webkitAccessibleImageGetImagePosition): Ditto.
     74        (webkitAccessibleImageGetImageDescription): Ditto.
     75        (webkitAccessibleImageGetImageSize): Ditto.
     76        * accessibility/atk/WebKitAccessibleInterfaceSelection.cpp:
     77        (webkitAccessibleSelectionAddSelection): Ditto.
     78        (webkitAccessibleSelectionClearSelection): Ditto.
     79        (webkitAccessibleSelectionRefSelection): Ditto.
     80        (webkitAccessibleSelectionGetSelectionCount): Ditto.
     81        (webkitAccessibleSelectionIsChildSelected): Ditto.
     82        (webkitAccessibleSelectionRemoveSelection): Ditto.
     83        (webkitAccessibleSelectionSelectAllSelection): Ditto.
     84        * accessibility/atk/WebKitAccessibleInterfaceTable.cpp:
     85        (webkitAccessibleTableRefAt): Ditto.
     86        (webkitAccessibleTableGetIndexAt): Ditto.
     87        (webkitAccessibleTableGetColumnAtIndex): Ditto.
     88        (webkitAccessibleTableGetRowAtIndex): Ditto.
     89        (webkitAccessibleTableGetNColumns): Ditto.
     90        (webkitAccessibleTableGetNRows): Ditto.
     91        (webkitAccessibleTableGetColumnExtentAt): Ditto.
     92        (webkitAccessibleTableGetRowExtentAt): Ditto.
     93        (webkitAccessibleTableGetColumnHeader): Ditto.
     94        (webkitAccessibleTableGetRowHeader): Ditto.
     95        (webkitAccessibleTableGetCaption): Ditto.
     96        (webkitAccessibleTableGetColumnDescription): Ditto.
     97        (webkitAccessibleTableGetRowDescription): Ditto.
     98        * accessibility/atk/WebKitAccessibleInterfaceText.cpp:
     99        (webkitAccessibleTextGetText): Ditto.
     100        (webkitAccessibleTextGetTextAfterOffset): Ditto.
     101        (webkitAccessibleTextGetTextAtOffset): Ditto.
     102        (webkitAccessibleTextGetTextBeforeOffset): Ditto.
     103        (webkitAccessibleTextGetCharacterAtOffset): Ditto.
     104        (webkitAccessibleTextGetCaretOffset): Ditto.
     105        (webkitAccessibleTextGetRunAttributes): Ditto.
     106        (webkitAccessibleTextGetDefaultAttributes): Ditto.
     107        (webkitAccessibleTextGetCharacterExtents): Ditto.
     108        (webkitAccessibleTextGetRangeExtents): Ditto.
     109        (webkitAccessibleTextGetCharacterCount): Ditto.
     110        (webkitAccessibleTextGetOffsetAtPoint): Ditto.
     111        (webkitAccessibleTextGetNSelections): Ditto.
     112        (webkitAccessibleTextGetSelection): Ditto.
     113        (webkitAccessibleTextAddSelection): Ditto.
     114        (webkitAccessibleTextSetSelection): Ditto.
     115        (webkitAccessibleTextRemoveSelection): Ditto.
     116        (webkitAccessibleTextSetCaretOffset): Ditto.
     117        * accessibility/atk/WebKitAccessibleInterfaceValue.cpp:
     118        (webkitAccessibleValueGetCurrentValue): Ditto.
     119        (webkitAccessibleValueGetMaximumValue): Ditto.
     120        (webkitAccessibleValueGetMinimumValue): Ditto.
     121        (webkitAccessibleValueSetCurrentValue): Ditto.
     122        (webkitAccessibleValueGetMinimumIncrement): Ditto.
     123        * accessibility/atk/WebKitAccessibleWrapperAtk.cpp:
     124        (core): Removed, as it's not actually needed.
     125        (webkitAccessibleGetName):  Protect entry point.
     126        (webkitAccessibleGetDescription): Ditto.
     127        (webkitAccessibleGetParent): Ditto.
     128        (webkitAccessibleGetNChildren): Ditto.
     129        (webkitAccessibleRefChild): Ditto.
     130        (webkitAccessibleGetIndexInParent): Ditto.
     131        (webkitAccessibleGetAttributes): Ditto.
     132        (webkitAccessibleGetRole): Ditto.
     133        (webkitAccessibleRefStateSet): Ditto.
     134        (webkitAccessibleRefRelationSet): Ditto.
     135        (webkitAccessibleGetObjectLocale): Ditto.
     136        (webkitAccessibleDetach): Ditto.
     137        (webkitAccessibleIsDetached): New helper function, to be used from
     138        the newly added macros. We need to check whether the wrapper is
     139        detached and not just the wrapper AccessibilityObject since once
     140        the detachment happens we can't trust anything but the AtkObject
     141        from the wrapper (the AccessibilityObject might be invalid).
     142        * accessibility/atk/WebKitAccessibleWrapperAtk.h:
     143
     144        Assert that the render tree is neither being updated nor in need
     145        of being updated before trying to compute the text under a given
     146        element, since that might lead to crashes due to the constructor
     147        of TextIterator calling updateLayoutIgnorePendingStylesheets().
     148
     149        * accessibility/AccessibilityNodeObject.cpp:
     150        (WebCore::AccessibilityNodeObject::textUnderElement): Assert that
     151        the render tree is neither being updated nor needing updating.
     152
    11532013-09-27  Mario Sanchez Prada  <mario.prada@samsung.com>
    2154
  • trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp

    r156339 r156532  
    6969#include "Page.h"
    7070#include "ProgressTracker.h"
     71#include "RenderView.h"
    7172#include "SVGElement.h"
    7273#include "SVGNames.h"
     
    15801581    if (node && node->isTextNode())
    15811582        return toText(node)->wholeText();
     1583
     1584    // The render tree should be stable before going ahead. Otherwise, further uses of the
     1585    // TextIterator will force a layout update, potentially altering the accessibility tree
     1586    // and leading to crashes in the loop that computes the result text from the children.
     1587    ASSERT(!document()->renderView()->layoutState());
     1588    ASSERT(!document()->childNeedsStyleRecalc());
    15821589
    15831590    StringBuilder builder;
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleHyperlink.cpp

    r154937 r156532  
    9595    g_return_val_if_fail(WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv->hyperlinkImpl, FALSE);
    9696    g_return_val_if_fail(!index, FALSE);
     97    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv->hyperlinkImpl, FALSE);
    9798
    9899    if (!ATK_IS_ACTION(WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv->hyperlinkImpl))
     
    110111    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE_HYPERLINK(action), 0);
    111112    g_return_val_if_fail(WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv->hyperlinkImpl, 0);
     113    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv->hyperlinkImpl, 0);
    112114
    113115    if (!ATK_IS_ACTION(WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv->hyperlinkImpl))
     
    122124    g_return_val_if_fail(WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv->hyperlinkImpl, 0);
    123125    g_return_val_if_fail(!index, 0);
     126    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv->hyperlinkImpl, 0);
    124127
    125128    // TODO: Need a way to provide/localize action descriptions.
     
    131134{
    132135    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE_HYPERLINK(action), 0);
     136    g_return_val_if_fail(WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv->hyperlinkImpl, 0);
    133137    g_return_val_if_fail(!index, 0);
    134138
    135139    WebKitAccessibleHyperlinkPrivate* priv = WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv;
    136     g_return_val_if_fail(priv->hyperlinkImpl, 0);
     140    returnValIfWebKitAccessibleIsInvalid(priv->hyperlinkImpl, 0);
    137141
    138142    if (!ATK_IS_ACTION(priv->hyperlinkImpl))
     
    150154{
    151155    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE_HYPERLINK(action), 0);
     156    g_return_val_if_fail(WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv->hyperlinkImpl, 0);
    152157    g_return_val_if_fail(!index, 0);
    153158
    154159    WebKitAccessibleHyperlinkPrivate* priv = WEBKIT_ACCESSIBLE_HYPERLINK(action)->priv;
    155     g_return_val_if_fail(priv->hyperlinkImpl, 0);
     160    returnValIfWebKitAccessibleIsInvalid(priv->hyperlinkImpl, 0);
    156161
    157162    if (!ATK_IS_ACTION(priv->hyperlinkImpl))
     
    178183{
    179184    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE_HYPERLINK(link), 0);
     185    g_return_val_if_fail(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, 0);
     186
    180187    // FIXME: Do NOT support more than one instance of an AtkObject
    181188    // implementing AtkHyperlinkImpl in every instance of AtkHyperLink
    182189    g_return_val_if_fail(!index, 0);
    183190
     191    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, 0);
     192
    184193    AccessibilityObject* coreObject = core(link);
    185194    if (!coreObject || coreObject->url().isNull())
     
    197206    // implementing AtkHyperlinkImpl in every instance of AtkHyperLink
    198207    g_return_val_if_fail(!index, 0);
     208
     209    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, 0);
    199210
    200211    return ATK_OBJECT(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl);
     
    231242{
    232243    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE_HYPERLINK(link), 0);
     244    g_return_val_if_fail(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, 0);
     245    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, 0);
    233246
    234247    AccessibilityObject* coreObject = core(link);
     
    255268{
    256269    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE_HYPERLINK(link), 0);
     270    g_return_val_if_fail(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, 0);
     271    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, 0);
    257272
    258273    AccessibilityObject* coreObject = core(link);
     
    278293static gboolean webkitAccessibleHyperlinkIsValid(AtkHyperlink* link)
    279294{
    280     g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE_HYPERLINK(link), 0);
     295    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE_HYPERLINK(link), FALSE);
    281296    g_return_val_if_fail(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, FALSE);
     297    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, FALSE);
    282298
    283299    // Link is valid for the whole object's lifetime
     
    291307    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE_HYPERLINK(link), 0);
    292308    g_return_val_if_fail(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, 0);
     309    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, 0);
     310
    293311    return 1;
    294312}
    295313
    296 static gboolean webkitAccessibleHyperlinkIsSelectedLink(AtkHyperlink*)
    297 {
     314static gboolean webkitAccessibleHyperlinkIsSelectedLink(AtkHyperlink* link)
     315{
     316    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE_HYPERLINK(link), FALSE);
     317    g_return_val_if_fail(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, FALSE);
     318    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE_HYPERLINK(link)->priv->hyperlinkImpl, FALSE);
     319
    298320    // Not implemented: this function is deprecated in ATK now
    299321    notImplemented();
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceAction.cpp

    r144636 r156532  
    5252static gboolean webkitAccessibleActionDoAction(AtkAction* action, gint index)
    5353{
     54    g_return_val_if_fail(ATK_IS_ACTION(action), FALSE);
    5455    g_return_val_if_fail(!index, FALSE);
     56
     57    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(action), FALSE);
     58
    5559    return core(action)->performDefaultAction();
    5660}
    5761
    58 static gint webkitAccessibleActionGetNActions(AtkAction*)
     62static gint webkitAccessibleActionGetNActions(AtkAction* action)
    5963{
     64    g_return_val_if_fail(ATK_IS_ACTION(action), 0);
     65    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(action), 0);
     66
    6067    return 1;
    6168}
    6269
    63 static const gchar* webkitAccessibleActionGetDescription(AtkAction*, gint)
     70static const gchar* webkitAccessibleActionGetDescription(AtkAction* action, gint)
    6471{
     72    g_return_val_if_fail(ATK_IS_ACTION(action), 0);
     73    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(action), 0);
     74
    6575    // TODO: Need a way to provide/localize action descriptions.
    6676    notImplemented();
     
    7080static const gchar* webkitAccessibleActionGetKeybinding(AtkAction* action, gint index)
    7181{
     82    g_return_val_if_fail(ATK_IS_ACTION(action), 0);
    7283    g_return_val_if_fail(!index, 0);
     84    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(action), 0);
     85
    7386    // FIXME: Construct a proper keybinding string.
    7487    return cacheAndReturnAtkProperty(ATK_OBJECT(action), AtkCachedActionKeyBinding, core(action)->accessKey().string());
     
    7790static const gchar* webkitAccessibleActionGetName(AtkAction* action, gint index)
    7891{
     92    g_return_val_if_fail(ATK_IS_ACTION(action), 0);
    7993    g_return_val_if_fail(!index, 0);
     94    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(action), 0);
     95
    8096    return cacheAndReturnAtkProperty(ATK_OBJECT(action), AtkCachedActionName, core(action)->actionVerb());
    8197}
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceComponent.cpp

    r139159 r156532  
    6969static AtkObject* webkitAccessibleComponentRefAccessibleAtPoint(AtkComponent* component, gint x, gint y, AtkCoordType coordType)
    7070{
     71    g_return_val_if_fail(ATK_IS_COMPONENT(component), 0);
     72    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(component), 0);
     73
    7174    IntPoint pos = atkToContents(core(component), coordType, x, y);
    7275
     
    8083static void webkitAccessibleComponentGetExtents(AtkComponent* component, gint* x, gint* y, gint* width, gint* height, AtkCoordType coordType)
    8184{
     85    g_return_if_fail(ATK_IS_COMPONENT(component));
     86    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(component));
     87
    8288    IntRect rect = pixelSnappedIntRect(core(component)->elementRect());
    8389    contentsRelativeToAtkCoordinateType(core(component), coordType, rect, x, y, width, height);
     
    8692static gboolean webkitAccessibleComponentGrabFocus(AtkComponent* component)
    8793{
     94    g_return_val_if_fail(ATK_IS_COMPONENT(component), FALSE);
     95    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(component), FALSE);
     96
    8897    core(component)->setFocused(true);
    8998    return core(component)->isFocused();
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceDocument.cpp

    r151524 r156532  
    7979static const gchar* webkitAccessibleDocumentGetAttributeValue(AtkDocument* document, const gchar* attribute)
    8080{
     81    g_return_val_if_fail(ATK_IS_DOCUMENT(document), 0);
     82    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(document), 0);
     83
    8184    return documentAttributeValue(document, attribute);
    8285}
     
    8487static AtkAttributeSet* webkitAccessibleDocumentGetAttributes(AtkDocument* document)
    8588{
     89    g_return_val_if_fail(ATK_IS_DOCUMENT(document), 0);
     90    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(document), 0);
     91
    8692    AtkAttributeSet* attributeSet = 0;
    8793    const gchar* attributes[] = { "DocType", "Encoding", "URI" };
     
    98104static const gchar* webkitAccessibleDocumentGetLocale(AtkDocument* document)
    99105{
     106    g_return_val_if_fail(ATK_IS_DOCUMENT(document), 0);
     107    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(document), 0);
     108
    100109    // The logic to resolve locale has been moved to
    101110    // AtkObject::get_object_locale() virtual method. However, to avoid breaking
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceEditableText.cpp

    r150140 r156532  
    3939#include "Frame.h"
    4040#include "NotImplemented.h"
     41#include "WebKitAccessibleUtil.h"
    4142#include "WebKitAccessibleWrapperAtk.h"
    4243
     
    5152}
    5253
    53 static gboolean webkitAccessibleEditableTextSetRunAttributes(AtkEditableText*, AtkAttributeSet*, gint, gint)
     54static gboolean webkitAccessibleEditableTextSetRunAttributes(AtkEditableText* text, AtkAttributeSet*, gint, gint)
    5455{
     56    g_return_val_if_fail(ATK_IS_EDITABLE_TEXT(text), FALSE);
     57    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), FALSE);
     58
    5559    notImplemented();
    5660    return FALSE;
     
    5963static void webkitAccessibleEditableTextSetTextContents(AtkEditableText* text, const gchar* string)
    6064{
     65    g_return_if_fail(ATK_IS_EDITABLE_TEXT(text));
     66    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text));
     67
    6168    // FIXME: string nullcheck?
    6269    core(text)->setValue(String::fromUTF8(string));
     
    6572static void webkitAccessibleEditableTextInsertText(AtkEditableText* text, const gchar* string, gint length, gint* position)
    6673{
     74    g_return_if_fail(ATK_IS_EDITABLE_TEXT(text));
     75    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text));
     76
    6777    if (!string)
    6878        return;
     
    8494}
    8595
    86 static void webkitAccessibleEditableTextCopyText(AtkEditableText*, gint, gint)
     96static void webkitAccessibleEditableTextCopyText(AtkEditableText* text, gint, gint)
    8797{
     98    g_return_if_fail(ATK_IS_EDITABLE_TEXT(text));
     99    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text));
     100
    88101    notImplemented();
    89102}
    90103
    91 static void webkitAccessibleEditableTextCutText(AtkEditableText*, gint, gint)
     104static void webkitAccessibleEditableTextCutText(AtkEditableText* text, gint, gint)
    92105{
     106    g_return_if_fail(ATK_IS_EDITABLE_TEXT(text));
     107    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text));
     108
    93109    notImplemented();
    94110}
     
    96112static void webkitAccessibleEditableTextDeleteText(AtkEditableText* text, gint startPos, gint endPos)
    97113{
     114    g_return_if_fail(ATK_IS_EDITABLE_TEXT(text));
     115    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text));
     116
    98117    AccessibilityObject* coreObject = core(text);
    99118    // FIXME: Not implemented in WebCore
     
    110129}
    111130
    112 static void webkitAccessibleEditableTextPasteText(AtkEditableText*, gint)
     131static void webkitAccessibleEditableTextPasteText(AtkEditableText* text, gint)
    113132{
     133    g_return_if_fail(ATK_IS_EDITABLE_TEXT(text));
     134    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text));
     135
    114136    notImplemented();
    115137}
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceHypertext.cpp

    r139159 r156532  
    2424
    2525#include "AccessibilityObject.h"
     26#include "WebKitAccessibleUtil.h"
    2627#include "WebKitAccessibleWrapperAtk.h"
    2728
     
    3839static AtkHyperlink* webkitAccessibleHypertextGetLink(AtkHypertext* hypertext, gint index)
    3940{
     41    g_return_val_if_fail(ATK_HYPERTEXT(hypertext), 0);
     42    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(hypertext), 0);
     43
    4044    AccessibilityObject::AccessibilityChildrenVector children = core(hypertext)->children();
    4145    if (index < 0 || static_cast<unsigned>(index) >= children.size())
     
    6367static gint webkitAccessibleHypertextGetNLinks(AtkHypertext* hypertext)
    6468{
     69    g_return_val_if_fail(ATK_HYPERTEXT(hypertext), 0);
     70    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(hypertext), 0);
     71
    6572    AccessibilityObject::AccessibilityChildrenVector children = core(hypertext)->children();
    6673    if (!children.size())
     
    8289static gint webkitAccessibleHypertextGetLinkIndex(AtkHypertext* hypertext, gint charIndex)
    8390{
     91    g_return_val_if_fail(ATK_HYPERTEXT(hypertext), -1);
     92    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(hypertext), -1);
     93
    8494    size_t linksCount = webkitAccessibleHypertextGetNLinks(hypertext);
    8595    if (!linksCount)
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceImage.cpp

    r144636 r156532  
    5252static void webkitAccessibleImageGetImagePosition(AtkImage* image, gint* x, gint* y, AtkCoordType coordType)
    5353{
     54    g_return_if_fail(ATK_IMAGE(image));
     55    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(image));
     56
    5457    IntRect rect = pixelSnappedIntRect(core(image)->elementRect());
    5558    contentsRelativeToAtkCoordinateType(core(image), coordType, rect, x, y);
     
    5861static const gchar* webkitAccessibleImageGetImageDescription(AtkImage* image)
    5962{
     63    g_return_val_if_fail(ATK_IMAGE(image), 0);
     64    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(image), 0);
     65
    6066    return cacheAndReturnAtkProperty(ATK_OBJECT(image), AtkCachedImageDescription, accessibilityDescription(core(image)));
    6167}
     
    6369static void webkitAccessibleImageGetImageSize(AtkImage* image, gint* width, gint* height)
    6470{
     71    g_return_if_fail(ATK_IMAGE(image));
     72    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(image));
     73
    6574    IntSize size = core(image)->pixelSnappedSize();
    6675
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceSelection.cpp

    r139159 r156532  
    3838#include "HTMLSelectElement.h"
    3939#include "RenderObject.h"
     40#include "WebKitAccessibleUtil.h"
    4041#include "WebKitAccessibleWrapperAtk.h"
    4142
     
    128129static gboolean webkitAccessibleSelectionAddSelection(AtkSelection* selection, gint index)
    129130{
     131    g_return_val_if_fail(ATK_SELECTION(selection), FALSE);
     132    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(selection), FALSE);
     133
    130134    AccessibilityObject* coreSelection = core(selection);
    131135    if (!coreSelection)
     
    143147static gboolean webkitAccessibleSelectionClearSelection(AtkSelection* selection)
    144148{
     149    g_return_val_if_fail(ATK_SELECTION(selection), FALSE);
     150    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(selection), FALSE);
     151
    145152    AccessibilityObject* coreSelection = core(selection);
    146153    if (!coreSelection)
     
    160167static AtkObject* webkitAccessibleSelectionRefSelection(AtkSelection* selection, gint index)
    161168{
     169    g_return_val_if_fail(ATK_SELECTION(selection), 0);
     170    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(selection), 0);
     171
    162172    AccessibilityObject* option = optionFromSelection(selection, index);
    163173    if (option) {
     
    172182static gint webkitAccessibleSelectionGetSelectionCount(AtkSelection* selection)
    173183{
     184    g_return_val_if_fail(ATK_SELECTION(selection), 0);
     185    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(selection), 0);
     186
    174187    AccessibilityObject* coreSelection = core(selection);
    175188    if (!coreSelection || !coreSelection->isAccessibilityRenderObject())
     
    196209static gboolean webkitAccessibleSelectionIsChildSelected(AtkSelection* selection, gint index)
    197210{
    198     AccessibilityObject* coreSelection = core(selection);
    199     if (!coreSelection)
    200         return 0;
     211    g_return_val_if_fail(ATK_SELECTION(selection), FALSE);
     212    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(selection), FALSE);
     213
     214    AccessibilityObject* coreSelection = core(selection);
     215    if (!coreSelection)
     216        return FALSE;
    201217
    202218    AccessibilityObject* option = optionFromList(selection, index);
     
    209225static gboolean webkitAccessibleSelectionRemoveSelection(AtkSelection* selection, gint index)
    210226{
    211     AccessibilityObject* coreSelection = core(selection);
    212     if (!coreSelection)
    213         return 0;
     227    g_return_val_if_fail(ATK_SELECTION(selection), FALSE);
     228    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(selection), FALSE);
     229
     230    AccessibilityObject* coreSelection = core(selection);
     231    if (!coreSelection)
     232        return FALSE;
    214233
    215234    // TODO: This is only getting called if i == 0. What is preventing the rest?
     
    225244static gboolean webkitAccessibleSelectionSelectAllSelection(AtkSelection* selection)
    226245{
     246    g_return_val_if_fail(ATK_SELECTION(selection), FALSE);
     247    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(selection), FALSE);
     248
    227249    AccessibilityObject* coreSelection = core(selection);
    228250    if (!coreSelection || !coreSelection->isMultiSelectable())
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceTable.cpp

    r156144 r156532  
    4343#include "RenderElement.h"
    4444#include "WebKitAccessibleInterfaceText.h"
     45#include "WebKitAccessibleUtil.h"
    4546#include "WebKitAccessibleWrapperAtk.h"
    4647
     
    9293static AtkObject* webkitAccessibleTableRefAt(AtkTable* table, gint row, gint column)
    9394{
     95    g_return_val_if_fail(ATK_TABLE(table), 0);
     96    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), 0);
     97
    9498    AccessibilityTableCell* axCell = cell(table, row, column);
    9599    if (!axCell)
     
    107111static gint webkitAccessibleTableGetIndexAt(AtkTable* table, gint row, gint column)
    108112{
     113    g_return_val_if_fail(ATK_TABLE(table), -1);
     114    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), -1);
     115
    109116    AccessibilityTableCell* axCell = cell(table, row, column);
    110117    AccessibilityTable* axTable = static_cast<AccessibilityTable*>(core(table));
     
    114121static gint webkitAccessibleTableGetColumnAtIndex(AtkTable* table, gint index)
    115122{
     123    g_return_val_if_fail(ATK_TABLE(table), -1);
     124    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), -1);
     125
    116126    AccessibilityTableCell* axCell = cellAtIndex(table, index);
    117127    if (axCell) {
     
    125135static gint webkitAccessibleTableGetRowAtIndex(AtkTable* table, gint index)
    126136{
     137    g_return_val_if_fail(ATK_TABLE(table), -1);
     138    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), -1);
     139
    127140    AccessibilityTableCell* axCell = cellAtIndex(table, index);
    128141    if (axCell) {
     
    136149static gint webkitAccessibleTableGetNColumns(AtkTable* table)
    137150{
     151    g_return_val_if_fail(ATK_TABLE(table), 0);
     152    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), 0);
     153
    138154    AccessibilityObject* accTable = core(table);
    139155    if (accTable->isAccessibilityRenderObject())
     
    144160static gint webkitAccessibleTableGetNRows(AtkTable* table)
    145161{
     162    g_return_val_if_fail(ATK_TABLE(table), 0);
     163    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), 0);
     164
    146165    AccessibilityObject* accTable = core(table);
    147166    if (accTable->isAccessibilityRenderObject())
     
    152171static gint webkitAccessibleTableGetColumnExtentAt(AtkTable* table, gint row, gint column)
    153172{
     173    g_return_val_if_fail(ATK_TABLE(table), 0);
     174    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), 0);
     175
    154176    AccessibilityTableCell* axCell = cell(table, row, column);
    155177    if (axCell) {
     
    163185static gint webkitAccessibleTableGetRowExtentAt(AtkTable* table, gint row, gint column)
    164186{
     187    g_return_val_if_fail(ATK_TABLE(table), 0);
     188    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), 0);
     189
    165190    AccessibilityTableCell* axCell = cell(table, row, column);
    166191    if (axCell) {
     
    174199static AtkObject* webkitAccessibleTableGetColumnHeader(AtkTable* table, gint column)
    175200{
     201    g_return_val_if_fail(ATK_TABLE(table), 0);
     202    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), 0);
     203
    176204    AccessibilityObject* accTable = core(table);
    177205    if (accTable->isAccessibilityRenderObject()) {
     
    192220static AtkObject* webkitAccessibleTableGetRowHeader(AtkTable* table, gint row)
    193221{
     222    g_return_val_if_fail(ATK_TABLE(table), 0);
     223    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), 0);
     224
    194225    AccessibilityObject* accTable = core(table);
    195226    if (accTable->isAccessibilityRenderObject()) {
     
    210241static AtkObject* webkitAccessibleTableGetCaption(AtkTable* table)
    211242{
     243    g_return_val_if_fail(ATK_TABLE(table), 0);
     244    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), 0);
     245
    212246    AccessibilityObject* accTable = core(table);
    213247    if (accTable->isAccessibilityRenderObject()) {
     
    224258static const gchar* webkitAccessibleTableGetColumnDescription(AtkTable* table, gint column)
    225259{
     260    g_return_val_if_fail(ATK_TABLE(table), 0);
     261    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), 0);
     262
    226263    AtkObject* columnHeader = atk_table_get_column_header(table, column);
    227264    if (columnHeader && ATK_IS_TEXT(columnHeader))
     
    233270static const gchar* webkitAccessibleTableGetRowDescription(AtkTable* table, gint row)
    234271{
     272    g_return_val_if_fail(ATK_TABLE(table), 0);
     273    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(table), 0);
     274
    235275    AtkObject* rowHeader = atk_table_get_row_header(table, row);
    236276    if (rowHeader && ATK_IS_TEXT(rowHeader))
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceText.cpp

    r156295 r156532  
    551551static gchar* webkitAccessibleTextGetText(AtkText* text, gint startOffset, gint endOffset)
    552552{
     553    g_return_val_if_fail(ATK_TEXT(text), 0);
     554    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     555
    553556    AccessibilityObject* coreObject = core(text);
    554557
     
    10771080static gchar* webkitAccessibleTextGetTextAfterOffset(AtkText* text, gint offset, AtkTextBoundary boundaryType, gint* startOffset, gint* endOffset)
    10781081{
     1082    g_return_val_if_fail(ATK_TEXT(text), 0);
     1083    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     1084
    10791085    return webkitAccessibleTextGetTextForOffset(text, offset, boundaryType, GetTextPositionAfter, startOffset, endOffset);
    10801086}
     
    10821088static gchar* webkitAccessibleTextGetTextAtOffset(AtkText* text, gint offset, AtkTextBoundary boundaryType, gint* startOffset, gint* endOffset)
    10831089{
     1090    g_return_val_if_fail(ATK_TEXT(text), 0);
     1091    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     1092
    10841093    return webkitAccessibleTextGetTextForOffset(text, offset, boundaryType, GetTextPositionAt, startOffset, endOffset);
    10851094}
     
    10871096static gchar* webkitAccessibleTextGetTextBeforeOffset(AtkText* text, gint offset, AtkTextBoundary boundaryType, gint* startOffset, gint* endOffset)
    10881097{
     1098    g_return_val_if_fail(ATK_TEXT(text), 0);
     1099    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     1100
    10891101    return webkitAccessibleTextGetTextForOffset(text, offset, boundaryType, GetTextPositionBefore, startOffset, endOffset);
    10901102}
    10911103
    1092 static gunichar webkitAccessibleTextGetCharacterAtOffset(AtkText*, gint)
    1093 {
     1104static gunichar webkitAccessibleTextGetCharacterAtOffset(AtkText* text, gint)
     1105{
     1106    g_return_val_if_fail(ATK_TEXT(text), 0);
     1107    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     1108
    10941109    notImplemented();
    10951110    return 0;
     
    10981113static gint webkitAccessibleTextGetCaretOffset(AtkText* text)
    10991114{
     1115    g_return_val_if_fail(ATK_TEXT(text), 0);
     1116    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     1117
    11001118    // coreObject is the unignored object whose offset the caller is requesting.
    11011119    // focusedObject is the object with the caret. It is likely ignored -- unless it's a link.
     
    11191137static AtkAttributeSet* webkitAccessibleTextGetRunAttributes(AtkText* text, gint offset, gint* startOffset, gint* endOffset)
    11201138{
     1139    g_return_val_if_fail(ATK_TEXT(text), 0);
     1140    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     1141
    11211142    AccessibilityObject* coreObject = core(text);
    11221143    AtkAttributeSet* result;
     
    11431164static AtkAttributeSet* webkitAccessibleTextGetDefaultAttributes(AtkText* text)
    11441165{
     1166    g_return_val_if_fail(ATK_TEXT(text), 0);
     1167    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     1168
    11451169    AccessibilityObject* coreObject = core(text);
    11461170    if (!coreObject || !coreObject->isAccessibilityRenderObject())
     
    11521176static void webkitAccessibleTextGetCharacterExtents(AtkText* text, gint offset, gint* x, gint* y, gint* width, gint* height, AtkCoordType coords)
    11531177{
     1178    g_return_if_fail(ATK_TEXT(text));
     1179    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text));
     1180
    11541181    IntRect extents = textExtents(text, offset, 1, coords);
    11551182    *x = extents.x();
     
    11611188static void webkitAccessibleTextGetRangeExtents(AtkText* text, gint startOffset, gint endOffset, AtkCoordType coords, AtkTextRectangle* rect)
    11621189{
     1190    g_return_if_fail(ATK_TEXT(text));
     1191    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text));
     1192
    11631193    IntRect extents = textExtents(text, startOffset, endOffset - startOffset, coords);
    11641194    rect->x = extents.x();
     
    11701200static gint webkitAccessibleTextGetCharacterCount(AtkText* text)
    11711201{
     1202    g_return_val_if_fail(ATK_TEXT(text), 0);
     1203    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     1204
    11721205    return accessibilityObjectLength(core(text));
    11731206}
     
    11751208static gint webkitAccessibleTextGetOffsetAtPoint(AtkText* text, gint x, gint y, AtkCoordType)
    11761209{
     1210    g_return_val_if_fail(ATK_TEXT(text), 0);
     1211    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     1212
    11771213    // FIXME: Use the AtkCoordType
    11781214    // TODO: Is it correct to ignore range.length?
     
    11841220static gint webkitAccessibleTextGetNSelections(AtkText* text)
    11851221{
     1222    g_return_val_if_fail(ATK_TEXT(text), 0);
     1223    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     1224
    11861225    AccessibilityObject* coreObject = core(text);
    11871226    VisibleSelection selection = coreObject->selection();
     
    12021241static gchar* webkitAccessibleTextGetSelection(AtkText* text, gint selectionNum, gint* startOffset, gint* endOffset)
    12031242{
     1243    g_return_val_if_fail(ATK_TEXT(text), 0);
     1244    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), 0);
     1245
    12041246    // WebCore does not support multiple selection, so anything but 0 does not make sense for now.
    12051247    if (selectionNum)
     
    12191261}
    12201262
    1221 static gboolean webkitAccessibleTextAddSelection(AtkText*, gint, gint)
    1222 {
     1263static gboolean webkitAccessibleTextAddSelection(AtkText* text, gint, gint)
     1264{
     1265    g_return_val_if_fail(ATK_TEXT(text), FALSE);
     1266    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), FALSE);
     1267
    12231268    notImplemented();
    12241269    return FALSE;
     
    12271272static gboolean webkitAccessibleTextSetSelection(AtkText* text, gint selectionNum, gint startOffset, gint endOffset)
    12281273{
     1274    g_return_val_if_fail(ATK_TEXT(text), FALSE);
     1275    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), FALSE);
     1276
    12291277    // WebCore does not support multiple selection, so anything but 0 does not make sense for now.
    12301278    if (selectionNum)
     
    12631311static gboolean webkitAccessibleTextRemoveSelection(AtkText* text, gint selectionNum)
    12641312{
     1313    g_return_val_if_fail(ATK_TEXT(text), FALSE);
     1314    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), FALSE);
     1315
    12651316    // WebCore does not support multiple selection, so anything but 0 does not make sense for now.
    12661317    if (selectionNum)
     
    12791330static gboolean webkitAccessibleTextSetCaretOffset(AtkText* text, gint offset)
    12801331{
     1332    g_return_val_if_fail(ATK_TEXT(text), FALSE);
     1333    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(text), FALSE);
     1334
    12811335    AccessibilityObject* coreObject = core(text);
    1282 
    12831336    if (!coreObject->isAccessibilityRenderObject())
    12841337        return FALSE;
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceValue.cpp

    r155854 r156532  
    2525#include "AccessibilityObject.h"
    2626#include "HTMLNames.h"
     27#include "WebKitAccessibleUtil.h"
    2728#include "WebKitAccessibleWrapperAtk.h"
    2829
     
    3940static void webkitAccessibleValueGetCurrentValue(AtkValue* value, GValue* gValue)
    4041{
     42    g_return_if_fail(ATK_VALUE(value));
     43    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(value));
     44
    4145    memset(gValue,  0, sizeof(GValue));
    4246    g_value_init(gValue, G_TYPE_FLOAT);
     
    4650static void webkitAccessibleValueGetMaximumValue(AtkValue* value, GValue* gValue)
    4751{
     52    g_return_if_fail(ATK_VALUE(value));
     53    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(value));
     54
    4855    memset(gValue,  0, sizeof(GValue));
    4956    g_value_init(gValue, G_TYPE_FLOAT);
     
    5360static void webkitAccessibleValueGetMinimumValue(AtkValue* value, GValue* gValue)
    5461{
     62    g_return_if_fail(ATK_VALUE(value));
     63    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(value));
     64
    5565    memset(gValue,  0, sizeof(GValue));
    5666    g_value_init(gValue, G_TYPE_FLOAT);
     
    6070static gboolean webkitAccessibleValueSetCurrentValue(AtkValue* value, const GValue* gValue)
    6171{
     72    g_return_val_if_fail(ATK_VALUE(value), FALSE);
     73    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(value), FALSE);
     74
    6275    double newValue;
    6376    if (G_VALUE_HOLDS_DOUBLE(gValue))
     
    7891        newValue = g_value_get_uint(gValue);
    7992    else
    80         return false;
     93        return FALSE;
    8194
    8295    AccessibilityObject* coreObject = core(value);
     
    94107static void webkitAccessibleValueGetMinimumIncrement(AtkValue* value, GValue* gValue)
    95108{
     109    g_return_if_fail(ATK_VALUE(value));
     110    returnIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(value));
     111
    96112    memset(gValue,  0, sizeof(GValue));
    97113    g_value_init(gValue, G_TYPE_FLOAT);
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleUtil.h

    r144636 r156532  
    3434}
    3535
     36// An existing accessibility object is considered to be invalid whether it's already
     37// detached or if it's not but just updating the layout will detach it anyway.
     38#define returnIfWebKitAccessibleIsInvalid(webkitAccessible) G_STMT_START { \
     39    if (!webkitAccessible || webkitAccessibleIsDetached(webkitAccessible)) { \
     40        return; \
     41    } else { \
     42        webkitAccessibleGetAccessibilityObject(webkitAccessible)->updateBackingStore(); \
     43        if (webkitAccessibleIsDetached(webkitAccessible)) \
     44            return; \
     45    }; } G_STMT_END
     46
     47#define returnValIfWebKitAccessibleIsInvalid(webkitAccessible, val) G_STMT_START { \
     48    if (!webkitAccessible || webkitAccessibleIsDetached(webkitAccessible)) { \
     49        return (val); \
     50    } else { \
     51        webkitAccessibleGetAccessibilityObject(webkitAccessible)->updateBackingStore(); \
     52        if (webkitAccessibleIsDetached(webkitAccessible)) \
     53            return (val); \
     54    }; } G_STMT_END
     55
    3656AtkAttributeSet* addToAtkAttributeSet(AtkAttributeSet*, const char* name, const char* value);
    3757
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp

    r156530 r156532  
    9797}
    9898
    99 static AccessibilityObject* core(WebKitAccessible* accessible)
    100 {
    101     if (!accessible)
    102         return 0;
    103 
    104     return accessible->m_object;
    105 }
    106 
    10799static AccessibilityObject* core(AtkObject* object)
    108100{
     
    110102        return 0;
    111103
    112     return core(WEBKIT_ACCESSIBLE(object));
     104    return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(object));
    113105}
    114106
    115107static const gchar* webkitAccessibleGetName(AtkObject* object)
    116108{
     109    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
     110    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0);
     111
    117112    AccessibilityObject* coreObject = core(object);
     113
    118114    if (!coreObject->isAccessibilityRenderObject())
    119115        return cacheAndReturnAtkProperty(object, AtkCachedAccessibleName, coreObject->stringValue());
     
    170166static const gchar* webkitAccessibleGetDescription(AtkObject* object)
    171167{
     168    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
     169    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0);
     170
    172171    AccessibilityObject* coreObject = core(object);
    173172    Node* node = 0;
     
    273272static AtkObject* webkitAccessibleGetParent(AtkObject* object)
    274273{
     274    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
     275    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0);
     276
    275277    // Check first if the parent has been already set.
    276278    AtkObject* accessibleParent = ATK_OBJECT_CLASS(webkitAccessibleParentClass)->get_parent(object);
     
    320322static gint webkitAccessibleGetNChildren(AtkObject* object)
    321323{
     324    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
     325    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0);
     326
    322327    AccessibilityObject* coreObject = core(object);
    323328
     
    357362static AtkObject* webkitAccessibleRefChild(AtkObject* object, gint index)
    358363{
     364    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
     365    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0);
     366
    359367    if (index < 0)
    360368        return 0;
     
    421429static gint webkitAccessibleGetIndexInParent(AtkObject* object)
    422430{
     431    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), -1);
     432    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), -1);
     433
    423434    AccessibilityObject* coreObject = core(object);
    424435    AccessibilityObject* parent = coreObject->parentObjectUnignored();
     
    453464static AtkAttributeSet* webkitAccessibleGetAttributes(AtkObject* object)
    454465{
     466    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
     467    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0);
     468
    455469    AtkAttributeSet* attributeSet = 0;
    456470#if PLATFORM(GTK)
     
    627641static AtkRole webkitAccessibleGetRole(AtkObject* object)
    628642{
     643    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), ATK_ROLE_UNKNOWN);
     644    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), ATK_ROLE_UNKNOWN);
     645
    629646    AccessibilityObject* coreObject = core(object);
    630647
     
    767784static AtkStateSet* webkitAccessibleRefStateSet(AtkObject* object)
    768785{
     786    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
     787
    769788    AtkStateSet* stateSet = ATK_OBJECT_CLASS(webkitAccessibleParentClass)->ref_state_set(object);
    770789    AccessibilityObject* coreObject = core(object);
     790
     791    // Make sure the layout is updated to really know whether the object
     792    // is defunct or not, so we can return the proper state.
     793    coreObject->updateBackingStore();
    771794
    772795    if (coreObject == fallbackObject()) {
     
    786809static AtkRelationSet* webkitAccessibleRefRelationSet(AtkObject* object)
    787810{
     811    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
     812    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0);
     813
    788814    AtkRelationSet* relationSet = ATK_OBJECT_CLASS(webkitAccessibleParentClass)->ref_relation_set(object);
    789815    AccessibilityObject* coreObject = core(object);
     
    806832static const gchar* webkitAccessibleGetObjectLocale(AtkObject* object)
    807833{
     834    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), 0);
     835    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), 0);
     836
     837    AccessibilityObject* coreObject = core(object);
     838    if (!coreObject)
     839        return 0;
     840
    808841    if (ATK_IS_DOCUMENT(object)) {
    809         AccessibilityObject* coreObject = core(object);
    810         if (!coreObject)
    811             return 0;
    812 
    813842        // TODO: Should we fall back on lang xml:lang when the following comes up empty?
    814843        String language = coreObject->language();
     
    10971126    ASSERT(accessible->m_object);
    10981127
    1099     if (core(accessible)->roleValue() == WebAreaRole)
     1128    if (accessible->m_object->roleValue() == WebAreaRole)
    11001129        g_signal_emit_by_name(accessible, "state-change", "defunct", true);
    11011130
     
    11041133    // detachment.
    11051134    accessible->m_object = fallbackObject();
     1135}
     1136
     1137bool webkitAccessibleIsDetached(WebKitAccessible* accessible)
     1138{
     1139    ASSERT(accessible->m_object);
     1140    return accessible->m_object == fallbackObject();
    11061141}
    11071142
  • trunk/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.h

    r144636 r156532  
    7878void webkitAccessibleDetach(WebKitAccessible*);
    7979
     80bool webkitAccessibleIsDetached(WebKitAccessible*);
     81
    8082AtkObject* webkitAccessibleGetFocusedElement(WebKitAccessible*);
    8183
Note: See TracChangeset for help on using the changeset viewer.