From 9ab0dd3905c529b9495c4897c543f1c3c8a511cc Mon Sep 17 00:00:00 2001 From: "aaronleventhal%moonset.net" Date: Wed, 16 Aug 2006 01:50:36 +0000 Subject: [PATCH] Bug 348616. Fix HTML button accessible and accessible objects when onclick is present. r=nian.liu --- .../src/base/nsAccessibilityService.cpp | 25 ++++++++++++------- .../src/base/nsBaseWidgetAccessible.cpp | 2 ++ .../src/html/nsHTMLFormControlAccessible.cpp | 2 +- .../src/html/nsHTMLFormControlAccessible.h | 2 +- accessible/src/msaa/nsAccessibleWrap.h | 2 +- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/accessible/src/base/nsAccessibilityService.cpp b/accessible/src/base/nsAccessibilityService.cpp index e4a99800ed09..14736b57234e 100644 --- a/accessible/src/base/nsAccessibilityService.cpp +++ b/accessible/src/base/nsAccessibilityService.cpp @@ -446,9 +446,6 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsISupports *aFrame, else if (tag == nsAccessibilityAtoms::a) { *aAccessible = new nsHTMLLinkAccessible(aNode, aWeakShell, NS_STATIC_CAST(nsIFrame*, aFrame)); } - else if (content->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::onclick)) { - *aAccessible = new nsLinkableAccessible(aNode, aWeakShell); - } else if (tag == nsAccessibilityAtoms::li) { // Normally this is created by the list item frame which knows about the bullet frame // However, in this case the list item must have been styled using display: foo @@ -474,7 +471,7 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsISupports *aFrame, tag == nsAccessibilityAtoms::thead || #endif tag == nsAccessibilityAtoms::q) { - *aAccessible = new nsHyperTextAccessible(aNode, aWeakShell); + return CreateHyperTextAccessible(aFrame, aAccessible); } NS_IF_ADDREF(*aAccessible); return NS_OK; @@ -504,7 +501,7 @@ nsAccessibilityService::CreateHTMLLIAccessible(nsISupports *aFrame, } NS_IMETHODIMP -nsAccessibilityService::CreateHyperTextAccessible(nsISupports *aFrame, nsIAccessible **_retval) +nsAccessibilityService::CreateHyperTextAccessible(nsISupports *aFrame, nsIAccessible **aAccessible) { nsIFrame* frame; nsCOMPtr node; @@ -513,11 +510,20 @@ nsAccessibilityService::CreateHyperTextAccessible(nsISupports *aFrame, nsIAccess if (NS_FAILED(rv)) return rv; - *_retval = new nsHyperTextAccessible(node, weakShell); - if (! *_retval) + nsCOMPtr content(do_QueryInterface(node)); + NS_ENSURE_TRUE(content, NS_ERROR_FAILURE); + if (content->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::onclick)) { + // nsLinkableAccessible inherits from nsHyperTextAccessible, but + // it also includes code for dealing with the onclick + *aAccessible = new nsLinkableAccessible(node, weakShell); + } + else { + *aAccessible = new nsHyperTextAccessible(node, weakShell); + } + if (nsnull == *aAccessible) return NS_ERROR_OUT_OF_MEMORY; - NS_ADDREF(*_retval); + NS_ADDREF(*aAccessible); return NS_OK; } @@ -1243,6 +1249,7 @@ NS_IMETHODIMP nsAccessibilityService::GetAccessible(nsIDOMNode *aNode, // of some property that makes this object interesting if (!newAcc && (content->IsFocusable() || + content->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::onclick) || content->HasAttr(kNameSpaceID_WAIProperties, nsAccessibilityAtoms::describedby) || content->HasAttr(kNameSpaceID_WAIProperties, nsAccessibilityAtoms::labelledby) || content->HasAttr(kNameSpaceID_WAIProperties, nsAccessibilityAtoms::required) || @@ -1254,7 +1261,7 @@ NS_IMETHODIMP nsAccessibilityService::GetAccessible(nsIDOMNode *aNode, // other accessibles can point to it, or so that it can hold a state, etc. if (content->IsNodeOfType(nsINode::eHTML)) { // Interesting HTML container which may have selectable text and/or embedded objects - newAcc = new nsHyperTextAccessible(aNode, aWeakShell); + CreateHyperTextAccessible(frame, getter_AddRefs(newAcc)); } else { // XUL, SVG, MathML etc. // Interesting generic non-HTML container diff --git a/accessible/src/base/nsBaseWidgetAccessible.cpp b/accessible/src/base/nsBaseWidgetAccessible.cpp index 3a3533024a32..395ebd2388b4 100644 --- a/accessible/src/base/nsBaseWidgetAccessible.cpp +++ b/accessible/src/base/nsBaseWidgetAccessible.cpp @@ -237,12 +237,14 @@ void nsLinkableAccessible::CacheActionContent() if (uri) { mActionContent = walkUpContent; mIsLink = PR_TRUE; + break; } } if (walkUpContent->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::onclick)) { mActionContent = walkUpContent; mIsOnclick = PR_TRUE; + break; } } } diff --git a/accessible/src/html/nsHTMLFormControlAccessible.cpp b/accessible/src/html/nsHTMLFormControlAccessible.cpp index c5522d61d305..66292ded728a 100644 --- a/accessible/src/html/nsHTMLFormControlAccessible.cpp +++ b/accessible/src/html/nsHTMLFormControlAccessible.cpp @@ -237,7 +237,7 @@ NS_IMETHODIMP nsHTMLButtonAccessible::GetName(nsAString& aName) // ----- HTML 4 Button: can contain arbitrary HTML content ----- nsHTML4ButtonAccessible::nsHTML4ButtonAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell): -nsLeafAccessible(aNode, aShell) +nsHyperTextAccessible(aNode, aShell) { } diff --git a/accessible/src/html/nsHTMLFormControlAccessible.h b/accessible/src/html/nsHTMLFormControlAccessible.h index 219c8740651e..40b16c9e2766 100644 --- a/accessible/src/html/nsHTMLFormControlAccessible.h +++ b/accessible/src/html/nsHTMLFormControlAccessible.h @@ -76,7 +76,7 @@ public: NS_IMETHOD DoAction(PRUint8 index); }; -class nsHTML4ButtonAccessible : public nsLeafAccessible +class nsHTML4ButtonAccessible : public nsHyperTextAccessible { public: diff --git a/accessible/src/msaa/nsAccessibleWrap.h b/accessible/src/msaa/nsAccessibleWrap.h index 4fe6a1cd3512..1a6916dbab01 100644 --- a/accessible/src/msaa/nsAccessibleWrap.h +++ b/accessible/src/msaa/nsAccessibleWrap.h @@ -196,7 +196,7 @@ protected: // Should this accessible be allowed to have any MSAA children static PRBool MustPrune(nsIAccessible *accessible) - { PRUint32 role; return NS_SUCCEEDED(accessible->GetRole(&role)) && (role == ROLE_ENTRY || role == ROLE_PASSWORD_TEXT); } + { PRUint32 role; return NS_SUCCEEDED(accessible->GetRole(&role)) && (role == ROLE_ENTRY || role == ROLE_PASSWORD_TEXT || role == ROLE_PUSHBUTTON); } }; // Define unsupported wrap classes here