diff --git a/accessible/src/html/nsHTMLImageAccessible.cpp b/accessible/src/html/nsHTMLImageAccessible.cpp index 261487351763..f4bb3442cbcc 100644 --- a/accessible/src/html/nsHTMLImageAccessible.cpp +++ b/accessible/src/html/nsHTMLImageAccessible.cpp @@ -30,6 +30,10 @@ #include "nsIDOMHTMLCollection.h" #include "nsIAccessibilityService.h" #include "nsIServiceManager.h" +#include "imgIRequest.h" +#include "imgIContainer.h" +#include "nsIImageFrame.h" +#include "nsIImageRequest.h" // --- image ----- @@ -55,6 +59,40 @@ nsLinkableAccessible(aDOMNode, aShell) } } +NS_IMETHODIMP nsHTMLImageAccessible::GetAccState(PRUint32 *_retval) +{ + // The state is a bitfield, get our inherited state, then logically OR it with STATE_ANIMATED if this + // is an animated image. + + nsLinkableAccessible::GetAccState(_retval); + + nsCOMPtr content(do_QueryInterface(mDOMNode)); + nsCOMPtr shell(do_QueryReferent(mPresShell)); + nsIFrame *frame = nsnull; + if (content && shell) + shell->GetPrimaryFrameFor(content, &frame); + + nsCOMPtr imageFrame(do_QueryInterface(frame)); + + nsCOMPtr imageRequest; + if (imageFrame) + imageFrame->GetImageRequest(getter_AddRefs(imageRequest)); + + nsCOMPtr imgContainer; + if (imageRequest) + imageRequest->GetImage(getter_AddRefs(imgContainer)); + + if (imgContainer) { + PRUint32 numFrames; + imgContainer->GetNumFrames(&numFrames); + if (numFrames > 1) + *_retval |= STATE_ANIMATED; + } + + return NS_OK; +} + + /* wstring getAccName (); */ NS_IMETHODIMP nsHTMLImageAccessible::GetAccName(nsAWritableString& _retval) { diff --git a/accessible/src/html/nsHTMLImageAccessible.h b/accessible/src/html/nsHTMLImageAccessible.h index 69e11d824da0..4223bcbdbd74 100644 --- a/accessible/src/html/nsHTMLImageAccessible.h +++ b/accessible/src/html/nsHTMLImageAccessible.h @@ -40,6 +40,7 @@ class nsHTMLImageAccessible : public nsLinkableAccessible public: nsHTMLImageAccessible(nsIDOMNode* aDomNode, nsIImageFrame *imageFrame, nsIWeakReference* aShell); NS_IMETHOD GetAccName(nsAWritableString& _retval); + NS_IMETHOD GetAccState(PRUint32 *_retval); NS_IMETHOD GetAccRole(PRUint32 *_retval); NS_IMETHOD GetAccFirstChild(nsIAccessible **_retval); NS_IMETHOD GetAccLastChild(nsIAccessible **_retval); diff --git a/accessible/src/nsHTMLImageAccessible.cpp b/accessible/src/nsHTMLImageAccessible.cpp index 261487351763..f4bb3442cbcc 100644 --- a/accessible/src/nsHTMLImageAccessible.cpp +++ b/accessible/src/nsHTMLImageAccessible.cpp @@ -30,6 +30,10 @@ #include "nsIDOMHTMLCollection.h" #include "nsIAccessibilityService.h" #include "nsIServiceManager.h" +#include "imgIRequest.h" +#include "imgIContainer.h" +#include "nsIImageFrame.h" +#include "nsIImageRequest.h" // --- image ----- @@ -55,6 +59,40 @@ nsLinkableAccessible(aDOMNode, aShell) } } +NS_IMETHODIMP nsHTMLImageAccessible::GetAccState(PRUint32 *_retval) +{ + // The state is a bitfield, get our inherited state, then logically OR it with STATE_ANIMATED if this + // is an animated image. + + nsLinkableAccessible::GetAccState(_retval); + + nsCOMPtr content(do_QueryInterface(mDOMNode)); + nsCOMPtr shell(do_QueryReferent(mPresShell)); + nsIFrame *frame = nsnull; + if (content && shell) + shell->GetPrimaryFrameFor(content, &frame); + + nsCOMPtr imageFrame(do_QueryInterface(frame)); + + nsCOMPtr imageRequest; + if (imageFrame) + imageFrame->GetImageRequest(getter_AddRefs(imageRequest)); + + nsCOMPtr imgContainer; + if (imageRequest) + imageRequest->GetImage(getter_AddRefs(imgContainer)); + + if (imgContainer) { + PRUint32 numFrames; + imgContainer->GetNumFrames(&numFrames); + if (numFrames > 1) + *_retval |= STATE_ANIMATED; + } + + return NS_OK; +} + + /* wstring getAccName (); */ NS_IMETHODIMP nsHTMLImageAccessible::GetAccName(nsAWritableString& _retval) { diff --git a/accessible/src/nsHTMLImageAccessible.h b/accessible/src/nsHTMLImageAccessible.h index 69e11d824da0..4223bcbdbd74 100644 --- a/accessible/src/nsHTMLImageAccessible.h +++ b/accessible/src/nsHTMLImageAccessible.h @@ -40,6 +40,7 @@ class nsHTMLImageAccessible : public nsLinkableAccessible public: nsHTMLImageAccessible(nsIDOMNode* aDomNode, nsIImageFrame *imageFrame, nsIWeakReference* aShell); NS_IMETHOD GetAccName(nsAWritableString& _retval); + NS_IMETHOD GetAccState(PRUint32 *_retval); NS_IMETHOD GetAccRole(PRUint32 *_retval); NS_IMETHOD GetAccFirstChild(nsIAccessible **_retval); NS_IMETHOD GetAccLastChild(nsIAccessible **_retval);