From f2b6379f0f63545be5fd26e0b10d462565dfe437 Mon Sep 17 00:00:00 2001 From: "aaronleventhal%moonset.net" Date: Thu, 5 Jul 2007 15:39:30 +0000 Subject: [PATCH] Bug 377783. Fix crash and clean up table a11y. r=evan.yan --- accessible/public/nsIAccessibilityService.idl | 3 +- accessible/public/nsIAccessibleTable.idl | 6 +- .../src/atk/nsXULTreeAccessibleWrap.cpp | 37 +-- accessible/src/atk/nsXULTreeAccessibleWrap.h | 8 - accessible/src/base/nsAccessibilityAtomList.h | 1 - .../src/base/nsAccessibilityService.cpp | 23 +- accessible/src/html/nsHTMLTableAccessible.cpp | 250 ++++++++---------- accessible/src/html/nsHTMLTableAccessible.h | 18 +- accessible/src/html/nsHyperTextAccessible.cpp | 5 +- layout/tables/nsTableOuterFrame.cpp | 15 ++ layout/tables/nsTableOuterFrame.h | 4 + 11 files changed, 170 insertions(+), 200 deletions(-) diff --git a/accessible/public/nsIAccessibilityService.idl b/accessible/public/nsIAccessibilityService.idl index e59f3d51f20..269ab44bb85 100644 --- a/accessible/public/nsIAccessibilityService.idl +++ b/accessible/public/nsIAccessibilityService.idl @@ -45,7 +45,7 @@ interface nsIFrame; interface nsObjectFrame; interface nsIContent; -[uuid(e4cdb7c5-d029-4bee-bff5-99455c6e0057)] +[uuid(0e9e2f00-b6f1-440d-821f-6b09d264cdaf)] interface nsIAccessibilityService : nsIAccessibleRetrieval { nsIAccessible createOuterDocAccessible(in nsIDOMNode aNode); @@ -74,6 +74,7 @@ interface nsIAccessibilityService : nsIAccessibleRetrieval nsIAccessible createHTMLTableHeadAccessible(in nsIDOMNode aDOMNode); nsIAccessible createHTMLTextAccessible(in nsISupports aFrame); nsIAccessible createHTMLTextFieldAccessible(in nsISupports aFrame); + nsIAccessible createHTMLCaptionAccessible(in nsISupports aFrame); nsIAccessible getAccessible(in nsIDOMNode aNode, in nsIPresShell aPresShell, in nsIWeakReference aWeakShell, diff --git a/accessible/public/nsIAccessibleTable.idl b/accessible/public/nsIAccessibleTable.idl index 213b28b0b19..90814b01611 100644 --- a/accessible/public/nsIAccessibleTable.idl +++ b/accessible/public/nsIAccessibleTable.idl @@ -43,11 +43,11 @@ interface nsIAccessible; -[scriptable, uuid(a776fee4-c0b8-4872-9e1e-72017243383f)] +[scriptable, uuid(dc13d184-a6df-45a1-92f0-5476fdaebc5a)] interface nsIAccessibleTable : nsISupports { - attribute nsIAccessible caption; - attribute AString summary; + readonly attribute nsIAccessible caption; + readonly attribute AString summary; readonly attribute long columns; readonly attribute nsIAccessibleTable columnHeader; readonly attribute long rows; diff --git a/accessible/src/atk/nsXULTreeAccessibleWrap.cpp b/accessible/src/atk/nsXULTreeAccessibleWrap.cpp index 9999e995eb7..747088382a3 100644 --- a/accessible/src/atk/nsXULTreeAccessibleWrap.cpp +++ b/accessible/src/atk/nsXULTreeAccessibleWrap.cpp @@ -50,7 +50,6 @@ NS_IMPL_ISUPPORTS_INHERITED1(nsXULTreeAccessibleWrap, nsXULTreeAccessible, nsIAc nsXULTreeAccessibleWrap::nsXULTreeAccessibleWrap(nsIDOMNode *aDOMNode, nsIWeakReference *aShell): nsXULTreeAccessible(aDOMNode, aShell) { - mCaption = nsnull; } // tree's children count is row count * col count + treecols count @@ -78,26 +77,13 @@ NS_IMETHODIMP nsXULTreeAccessibleWrap::GetChildCount(PRInt32 *aAccChildCount) NS_IMETHODIMP nsXULTreeAccessibleWrap::GetCaption(nsIAccessible **aCaption) { - *aCaption = mCaption; - NS_IF_ADDREF(*aCaption); - return NS_OK; -} - -NS_IMETHODIMP nsXULTreeAccessibleWrap::SetCaption(nsIAccessible *aCaption) -{ - mCaption = aCaption; + *aCaption = nsnull; return NS_OK; } NS_IMETHODIMP nsXULTreeAccessibleWrap::GetSummary(nsAString &aSummary) { - aSummary = mSummary; - return NS_OK; -} - -NS_IMETHODIMP nsXULTreeAccessibleWrap::SetSummary(const nsAString &aSummary) -{ - mSummary = aSummary; + aSummary.Truncate(); return NS_OK; } @@ -426,32 +412,17 @@ NS_IMPL_ISUPPORTS_INHERITED1(nsXULTreeColumnsAccessibleWrap, nsXULTreeColumnsAcc nsXULTreeColumnsAccessibleWrap::nsXULTreeColumnsAccessibleWrap(nsIDOMNode *aDOMNode, nsIWeakReference *aShell): nsXULTreeColumnsAccessible(aDOMNode, aShell) { - mCaption = nsnull; } NS_IMETHODIMP nsXULTreeColumnsAccessibleWrap::GetCaption(nsIAccessible **aCaption) { - *aCaption = mCaption; - NS_IF_ADDREF(*aCaption); - - return NS_OK; -} - -NS_IMETHODIMP nsXULTreeColumnsAccessibleWrap::SetCaption(nsIAccessible *aCaption) -{ - mCaption = aCaption; + *aCaption = nsnull; return NS_OK; } NS_IMETHODIMP nsXULTreeColumnsAccessibleWrap::GetSummary(nsAString &aSummary) { - aSummary = mSummary; - return NS_OK; -} - -NS_IMETHODIMP nsXULTreeColumnsAccessibleWrap::SetSummary(const nsAString &aSummary) -{ - mSummary = aSummary; + aSummary.Truncate(); return NS_OK; } diff --git a/accessible/src/atk/nsXULTreeAccessibleWrap.h b/accessible/src/atk/nsXULTreeAccessibleWrap.h index 4868d2b4d54..edbcb1e037c 100644 --- a/accessible/src/atk/nsXULTreeAccessibleWrap.h +++ b/accessible/src/atk/nsXULTreeAccessibleWrap.h @@ -57,10 +57,6 @@ public: NS_IMETHOD GetChildCount(PRInt32 *_retval); NS_IMETHOD ChangeSelection(PRInt32 aIndex, PRUint8 aMethod, PRBool *aSelState); - -private: - nsCOMPtr mCaption; - nsString mSummary; }; class nsXULTreeColumnsAccessibleWrap : public nsXULTreeColumnsAccessible, @@ -72,10 +68,6 @@ public: nsXULTreeColumnsAccessibleWrap(nsIDOMNode* aDOMNode, nsIWeakReference* aShell); virtual ~nsXULTreeColumnsAccessibleWrap() {} - -private: - nsCOMPtr mCaption; - nsString mSummary; }; #endif diff --git a/accessible/src/base/nsAccessibilityAtomList.h b/accessible/src/base/nsAccessibilityAtomList.h index 72d9f61e9ca..545bf19fbf9 100755 --- a/accessible/src/base/nsAccessibilityAtomList.h +++ b/accessible/src/base/nsAccessibilityAtomList.h @@ -90,7 +90,6 @@ ACCESSIBILITY_ATOM(area, "area") ACCESSIBILITY_ATOM(blockquote, "blockquote") ACCESSIBILITY_ATOM(br, "br") ACCESSIBILITY_ATOM(body, "body") -ACCESSIBILITY_ATOM(caption, "caption") ACCESSIBILITY_ATOM(choices, "choices") // XForms ACCESSIBILITY_ATOM(description, "description") // XUL ACCESSIBILITY_ATOM(dd, "dd") diff --git a/accessible/src/base/nsAccessibilityService.cpp b/accessible/src/base/nsAccessibilityService.cpp index b0fc3e40a5b..7c40189cefb 100644 --- a/accessible/src/base/nsAccessibilityService.cpp +++ b/accessible/src/base/nsAccessibilityService.cpp @@ -477,7 +477,6 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsIFrame *aFrame, else if (tag == nsAccessibilityAtoms::abbr || tag == nsAccessibilityAtoms::acronym || tag == nsAccessibilityAtoms::blockquote || - tag == nsAccessibilityAtoms::caption || tag == nsAccessibilityAtoms::dd || tag == nsAccessibilityAtoms::dl || tag == nsAccessibilityAtoms::dt || @@ -882,6 +881,24 @@ nsAccessibilityService::CreateHTMLBRAccessible(nsISupports *aFrame, nsIAccessibl return NS_OK; } +NS_IMETHODIMP +nsAccessibilityService::CreateHTMLCaptionAccessible(nsISupports *aFrame, nsIAccessible **_retval) +{ + nsIFrame* frame; + nsCOMPtr node; + nsCOMPtr weakShell; + nsresult rv = GetInfo(aFrame, &frame, getter_AddRefs(weakShell), getter_AddRefs(node)); + if (NS_FAILED(rv)) + return rv; + + *_retval = new nsHTMLCaptionAccessible(node, weakShell); + if (! *_retval) + return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(*_retval); + return NS_OK; +} + NS_IMETHODIMP nsAccessibilityService::GetCachedAccessible(nsIDOMNode *aNode, nsIWeakReference *aWeakShell, nsIAccessible **aAccessible) @@ -1369,6 +1386,10 @@ NS_IMETHODIMP nsAccessibilityService::GetAccessible(nsIDOMNode *aNode, } if (tryFrame) { + if (frame->GetRect().IsEmpty()) { + *aIsHidden = PR_TRUE; + return NS_OK; + } frame->GetAccessible(getter_AddRefs(newAcc)); // Try using frame to do it } } diff --git a/accessible/src/html/nsHTMLTableAccessible.cpp b/accessible/src/html/nsHTMLTableAccessible.cpp index 667feb82593..84f18629376 100644 --- a/accessible/src/html/nsHTMLTableAccessible.cpp +++ b/accessible/src/html/nsHTMLTableAccessible.cpp @@ -49,7 +49,6 @@ #include "nsIAccessibilityService.h" #include "nsIDOMCSSStyleDeclaration.h" #include "nsIDOMHTMLCollection.h" -#include "nsIDOMHTMLTableCaptionElem.h" #include "nsIDOMHTMLTableCellElement.h" #include "nsIDOMHTMLTableElement.h" #include "nsIDOMHTMLTableRowElement.h" @@ -92,7 +91,6 @@ NS_IMPL_ISUPPORTS_INHERITED1(nsHTMLTableAccessible, nsAccessible, nsIAccessibleT nsHTMLTableAccessible::nsHTMLTableAccessible(nsIDOMNode* aDomNode, nsIWeakReference* aShell): nsAccessibleWrap(aDomNode, aShell) { - mHasCaption = PR_FALSE; } void nsHTMLTableAccessible::CacheChildren() @@ -102,51 +100,37 @@ void nsHTMLTableAccessible::CacheChildren() mAccChildCount = eChildCountUninitialized; return; } - + if (mAccChildCount == eChildCountUninitialized) { - PRInt32 childCount = 0; - nsCOMPtr privatePrevAccessible; + nsAccessible::CacheChildren(); nsCOMPtr captionAccessible; - GetCaption(getter_AddRefs(captionAccessible)); - if (captionAccessible) { - mHasCaption = PR_TRUE; - SetFirstChild(captionAccessible); - ++ childCount; - privatePrevAccessible = do_QueryInterface(captionAccessible); - privatePrevAccessible->SetParent(this); - } - else { - mHasCaption = PR_FALSE; - } - - PRBool allowsAnonChildren = PR_FALSE; - GetAllowsAnonChildAccessibles(&allowsAnonChildren); - nsAccessibleTreeWalker walker(mWeakShell, mDOMNode, allowsAnonChildren); - walker.mState.frame = GetFrame(); - - walker.GetFirstChild(); - while (walker.mState.accessible) { - nsCOMPtr content(do_QueryInterface(walker.mState.domNode)); - NS_ASSERTION(content, "Creating accessible for node in HTMLTable with no content"); - if (content && content->IsNodeOfType(nsINode::eHTML) && - content->Tag() == nsAccessibilityAtoms::caption) { - // We have already dealt with caption, ignore this one - walker.GetNextSibling(); - continue; + while (NextChild(captionAccessible)) { + if (Role(captionAccessible) == nsIAccessibleRole::ROLE_CAPTION) { + nsCOMPtr captionParentAccessible; + captionAccessible->GetParent(getter_AddRefs(captionParentAccessible)); + if (captionParentAccessible != this) { + NS_WARNING("Should not happen: parser ensures caption is the table's child, not the tbody's"); + return; + } + nsCOMPtr beforeCaptionAccessible; + captionAccessible->GetPreviousSibling(getter_AddRefs(beforeCaptionAccessible)); + if (beforeCaptionAccessible) { + // Move caption accessible so that it's the first child + nsCOMPtr afterCaptionAccessible; + captionAccessible->GetNextSibling(getter_AddRefs(afterCaptionAccessible)); + nsCOMPtr privateAcc = do_QueryInterface(beforeCaptionAccessible); + privateAcc->SetNextSibling(afterCaptionAccessible); + GetFirstChild(getter_AddRefs(afterCaptionAccessible)); + SetFirstChild(captionAccessible); + privateAcc = do_QueryInterface(captionAccessible); + privateAcc->SetNextSibling(afterCaptionAccessible); + } + // Don't check for more captions, because nsAccessibilityService ensures + // we don't create accessibles for the other captions, since only the + // first is actually visible + break; } - - ++ childCount; - if (privatePrevAccessible) { - privatePrevAccessible->SetNextSibling(walker.mState.accessible); - } - else { - SetFirstChild(walker.mState.accessible); - } - privatePrevAccessible = do_QueryInterface(walker.mState.accessible); - privatePrevAccessible->SetParent(this); - walker.GetNextSibling(); } - mAccChildCount = childCount; } } @@ -173,34 +157,14 @@ NS_IMETHODIMP nsHTMLTableAccessible::GetName(nsAString& aName) { aName.Truncate(); // Default name is blank - if (mRoleMapEntry) { - nsAccessible::GetName(aName); - if (!aName.IsEmpty()) { - return NS_OK; - } - } - - nsCOMPtr element(do_QueryInterface(mDOMNode)); - if (element) { - nsCOMPtr captions; - nsAutoString nameSpaceURI; - element->GetNamespaceURI(nameSpaceURI); - element->GetElementsByTagNameNS(nameSpaceURI, NS_LITERAL_STRING("caption"), - getter_AddRefs(captions)); - if (captions) { - nsCOMPtr captionNode; - captions->Item(0, getter_AddRefs(captionNode)); - if (captionNode) { - nsCOMPtr captionContent(do_QueryInterface(captionNode)); - AppendFlatStringFromSubtree(captionContent, &aName); - } - } - if (aName.IsEmpty()) { - nsCOMPtr content(do_QueryInterface(element)); - NS_ASSERTION(content, "No content for DOM element"); + nsAccessible::GetName(aName); + if (aName.IsEmpty()) { + nsCOMPtr content(do_QueryInterface(mDOMNode)); + if (content) { content->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::summary, aName); } } + return NS_OK; } @@ -226,65 +190,39 @@ nsHTMLTableAccessible::GetAttributesInternal(nsIPersistentProperties *aAttribute } NS_IMETHODIMP -nsHTMLTableAccessible::GetCaption(nsIAccessible **aCaption) +nsHTMLTableAccessible::GetAccessibleRelated(PRUint32 aRelationType, + nsIAccessible **aRelated) { - *aCaption = nsnull; - nsresult rv = NS_OK; + NS_ENSURE_ARG_POINTER(aRelated); + *aRelated = nsnull; - nsCOMPtr table(do_QueryInterface(mDOMNode)); - NS_ENSURE_TRUE(table, NS_ERROR_FAILURE); - - nsCOMPtr caption; - rv = table->GetCaption(getter_AddRefs(caption)); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr captionNode(do_QueryInterface(caption)); - if (!captionNode) { - return NS_OK; + if (!mDOMNode) { + return NS_ERROR_FAILURE; } - nsCOMPtr accService = GetAccService(); - NS_ENSURE_TRUE(accService, NS_ERROR_FAILURE); - - accService->GetCachedAccessible(captionNode, mWeakShell, aCaption); - if (*aCaption) - return NS_OK; - - nsCOMPtr presShell(GetPresShell()); - nsCOMPtr content(do_QueryInterface(captionNode)); - NS_ENSURE_TRUE(presShell && content, NS_ERROR_FAILURE); - nsIFrame* frame = presShell->GetPrimaryFrameFor(content); - if (!frame) { - return NS_OK; + nsresult rv = nsAccessibleWrap::GetAccessibleRelated(aRelationType, aRelated); + if (NS_FAILED(rv) || *aRelated) { + // Either the node is shut down, or another relation mechanism has been used + return rv; } - accService->CreateHyperTextAccessible(frame, aCaption); - nsCOMPtr accessNode(do_QueryInterface(*aCaption)); - return accessNode ? accessNode->Init() : NS_ERROR_FAILURE; + + if (aRelationType == nsIAccessibleRelation::RELATION_DESCRIBED_BY) { + return GetCaption(aRelated); + } + + return NS_OK; } + NS_IMETHODIMP -nsHTMLTableAccessible::SetCaption(nsIAccessible *aCaption) +nsHTMLTableAccessible::GetCaption(nsIAccessible **aCaption) { - nsresult rv = NS_OK; - - nsCOMPtr table(do_QueryInterface(mDOMNode)); - NS_ENSURE_TRUE(table, NS_ERROR_FAILURE); - - nsCOMPtr accessNode(do_QueryInterface(aCaption)); - NS_ASSERTION(accessNode, "Unable to QI to nsIAccessNode"); - nsCOMPtr domNode; - rv = accessNode->GetDOMNode(getter_AddRefs(domNode)); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr newDOMNode; - rv = domNode->CloneNode(PR_TRUE, getter_AddRefs(newDOMNode)); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr - captionElement(do_QueryInterface(newDOMNode)); - NS_ENSURE_TRUE(captionElement, NS_ERROR_FAILURE); - - return table->SetCaption(captionElement); + nsCOMPtr firstChild; + GetFirstChild(getter_AddRefs(firstChild)); + if (firstChild && Role(firstChild) == nsIAccessibleRole::ROLE_CAPTION) { + NS_ADDREF(*aCaption = firstChild); + } + return NS_OK; } NS_IMETHODIMP @@ -296,15 +234,6 @@ nsHTMLTableAccessible::GetSummary(nsAString &aSummary) return table->GetSummary(aSummary); } -NS_IMETHODIMP -nsHTMLTableAccessible::SetSummary(const nsAString &aSummary) -{ - nsCOMPtr table(do_QueryInterface(mDOMNode)); - NS_ENSURE_TRUE(table, NS_ERROR_FAILURE); - - return table->SetSummary(aSummary); -} - NS_IMETHODIMP nsHTMLTableAccessible::GetColumns(PRInt32 *aColumns) { @@ -820,20 +749,39 @@ nsHTMLTableAccessible::GetCellAt(PRInt32 aRowIndex, isSelected); } -#ifdef SHOW_LAYOUT_HEURISTIC NS_IMETHODIMP nsHTMLTableAccessible::GetDescription(nsAString& aDescription) { // Helpful for debugging layout vs. data tables aDescription.Truncate(); - PRBool isProbablyForLayout; - IsProbablyForLayout(&isProbablyForLayout); - aDescription = mLayoutHeuristic; + nsAccessible::GetDescription(aDescription); + if (!aDescription.IsEmpty()) { + return NS_OK; + } + + nsCOMPtr captionAccessible; + GetCaption(getter_AddRefs(captionAccessible)); + nsCOMPtr captionAccessNode = do_QueryInterface(captionAccessible); + if (captionAccessNode) { + nsCOMPtr captionNode; + captionAccessNode->GetDOMNode(getter_AddRefs(captionNode)); + nsCOMPtr captionContent = do_QueryInterface(captionNode); + if (captionContent) { + AppendFlatStringFromSubtree(captionContent, &aDescription); + } + } +#ifdef SHOW_LAYOUT_HEURISTIC + if (aDescription.IsEmpty()) { + PRBool isProbablyForLayout; + IsProbablyForLayout(&isProbablyForLayout); + aDescription = mLayoutHeuristic; + } #ifdef DEBUG_A11Y printf("\nTABLE: %s\n", NS_ConvertUTF16toUTF8(mLayoutHeuristic).get()); #endif +#endif + return NS_OK; } -#endif PRBool nsHTMLTableAccessible::HasDescendant(char *aTagName, PRBool aAllowEmpty) { @@ -1059,24 +1007,12 @@ nsHTMLTableHeadAccessible::GetCaption(nsIAccessible **aCaption) return NS_ERROR_NOT_IMPLEMENTED; } -NS_IMETHODIMP -nsHTMLTableHeadAccessible::SetCaption(nsIAccessible *aCaption) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - NS_IMETHODIMP nsHTMLTableHeadAccessible::GetSummary(nsAString &aSummary) { return NS_ERROR_NOT_IMPLEMENTED; } -NS_IMETHODIMP -nsHTMLTableHeadAccessible::SetSummary(const nsAString &aSummary) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - NS_IMETHODIMP nsHTMLTableHeadAccessible::GetColumnHeader(nsIAccessibleTable **aColumnHeader) { @@ -1098,3 +1034,29 @@ nsHTMLTableHeadAccessible::GetRows(PRInt32 *aRows) return rows->GetLength((PRUint32 *)aRows); } +NS_IMETHODIMP +nsHTMLCaptionAccessible::GetAccessibleRelated(PRUint32 aRelationType, + nsIAccessible **aRelated) +{ + NS_ENSURE_ARG_POINTER(aRelated); + *aRelated = nsnull; + + if (!mDOMNode) { + return NS_ERROR_FAILURE; + } + + nsresult rv = nsHyperTextAccessible::GetAccessibleRelated(aRelationType, aRelated); + if (NS_FAILED(rv) || *aRelated) { + // Either the node is shut down, or another relation mechanism has been used + return rv; + } + + if (aRelationType == nsIAccessibleRelation::RELATION_DESCRIPTION_FOR) { + return GetParent(aRelated); + } + + return NS_OK; +} + + + diff --git a/accessible/src/html/nsHTMLTableAccessible.h b/accessible/src/html/nsHTMLTableAccessible.h index 660d98af48f..653dea9b91f 100644 --- a/accessible/src/html/nsHTMLTableAccessible.h +++ b/accessible/src/html/nsHTMLTableAccessible.h @@ -71,9 +71,8 @@ public: NS_IMETHOD GetState(PRUint32 *aState, PRUint32 *aExtraState); NS_IMETHOD GetName(nsAString& aResult); virtual nsresult GetAttributesInternal(nsIPersistentProperties *aAttributes); -#ifdef SHOW_LAYOUT_HEURISTIC NS_IMETHOD GetDescription(nsAString& aDescription); -#endif + NS_IMETHOD GetAccessibleRelated(PRUint32 aRelationType, nsIAccessible **aRelated); protected: @@ -106,7 +105,6 @@ protected: PRInt32 aColIndex, nsIDOMElement* &aCell); PRBool HasDescendant(char *aTagName, PRBool aAllowEmpty = PR_TRUE); - PRBool mHasCaption; #ifdef SHOW_LAYOUT_HEURISTIC nsAutoString mLayoutHeuristic; #endif @@ -124,11 +122,21 @@ public: /* nsIAccessibleTable */ NS_IMETHOD GetCaption(nsIAccessible **aCaption); - NS_IMETHOD SetCaption(nsIAccessible *aCaption); NS_IMETHOD GetSummary(nsAString &aSummary); - NS_IMETHOD SetSummary(const nsAString &aSummary); NS_IMETHOD GetColumnHeader(nsIAccessibleTable **aColumnHeader); NS_IMETHOD GetRows(PRInt32 *aRows); }; +class nsHTMLCaptionAccessible : public nsHyperTextAccessibleWrap +{ +public: + nsHTMLCaptionAccessible(nsIDOMNode *aDomNode, nsIWeakReference *aShell) : + nsHyperTextAccessibleWrap(aDomNode, aShell) { } + + // nsIAccessible + NS_IMETHOD GetRole(PRUint32 *aRole) + { *aRole = nsIAccessibleRole::ROLE_CAPTION; return NS_OK; } + NS_IMETHOD GetAccessibleRelated(PRUint32 aRelationType, nsIAccessible **aRelated); +}; + #endif diff --git a/accessible/src/html/nsHyperTextAccessible.cpp b/accessible/src/html/nsHyperTextAccessible.cpp index 9d4cc676466..8b5d5e2eb22 100644 --- a/accessible/src/html/nsHyperTextAccessible.cpp +++ b/accessible/src/html/nsHyperTextAccessible.cpp @@ -140,10 +140,7 @@ NS_IMETHODIMP nsHyperTextAccessible::GetRole(PRUint32 *aRole) nsIAtom *tag = content->Tag(); - if (tag == nsAccessibilityAtoms::caption) { - *aRole = nsIAccessibleRole::ROLE_CAPTION; - } - else if (tag == nsAccessibilityAtoms::form) { + if (tag == nsAccessibilityAtoms::form) { *aRole = nsIAccessibleRole::ROLE_FORM; } else if (tag == nsAccessibilityAtoms::div || diff --git a/layout/tables/nsTableOuterFrame.cpp b/layout/tables/nsTableOuterFrame.cpp index 547ef2e1ee0..1b40c497664 100644 --- a/layout/tables/nsTableOuterFrame.cpp +++ b/layout/tables/nsTableOuterFrame.cpp @@ -137,6 +137,21 @@ nsTableCaptionFrame::GetParentStyleContextFrame(nsPresContext* aPresContext, aIsChild); } +#ifdef ACCESSIBILITY +NS_IMETHODIMP nsTableCaptionFrame::GetAccessible(nsIAccessible** aAccessible) +{ + *aAccessible = nsnull; + if (!GetRect().IsEmpty()) { + nsCOMPtr accService = do_GetService("@mozilla.org/accessibilityService;1"); + if (accService) { + return accService->CreateHTMLCaptionAccessible(NS_STATIC_CAST(nsIFrame*, this), aAccessible); + } + } + + return NS_ERROR_FAILURE; +} +#endif + #ifdef NS_DEBUG NS_IMETHODIMP nsTableCaptionFrame::GetFrameName(nsAString& aResult) const diff --git a/layout/tables/nsTableOuterFrame.h b/layout/tables/nsTableOuterFrame.h index a74359d8816..153cc55cbed 100644 --- a/layout/tables/nsTableOuterFrame.h +++ b/layout/tables/nsTableOuterFrame.h @@ -60,6 +60,10 @@ public: NS_IMETHOD GetParentStyleContextFrame(nsPresContext* aPresContext, nsIFrame** aProviderFrame, PRBool* aIsChild); +#ifdef ACCESSIBILITY + NS_IMETHOD GetAccessible(nsIAccessible** aAccessible); +#endif + #ifdef NS_DEBUG NS_IMETHOD GetFrameName(nsAString& aResult) const; #endif