2001-09-25 00:48:50 +00:00
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version : NPL 1.1 / GPL 2.0 / LGPL 2.1
2001-03-04 02:31:28 +00:00
*
2001-09-25 00:48:50 +00:00
* The contents of this file are subject to the Netscape Public License
* Version 1.1 ( the " License " ) ; you may not use this file except in
* compliance with the License . You may obtain a copy of the License at
* http : //www.mozilla.org/NPL/
2001-03-04 02:31:28 +00:00
*
2001-09-25 00:48:50 +00:00
* Software distributed under the License is distributed on an " AS IS " basis ,
* WITHOUT WARRANTY OF ANY KIND , either express or implied . See the License
* for the specific language governing rights and limitations under the
* License .
2001-03-04 02:31:28 +00:00
*
* The Original Code is mozilla . org code .
*
2001-09-25 00:48:50 +00:00
* The Initial Developer of the Original Code is
* Netscape Communications Corporation .
* Portions created by the Initial Developer are Copyright ( C ) 1998
* the Initial Developer . All Rights Reserved .
2001-03-04 02:31:28 +00:00
*
2001-09-25 00:48:50 +00:00
* Contributor ( s ) :
*
*
* Alternatively , the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later ( the " GPL " ) , or
* the GNU Lesser General Public License Version 2.1 or later ( the " LGPL " ) ,
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above . If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL , and not to allow others to
* use your version of this file under the terms of the NPL , indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL . If you do not delete
* the provisions above , a recipient may use your version of this file under
* the terms of any one of the NPL , the GPL or the LGPL .
*
* * * * * * END LICENSE BLOCK * * * * * */
2001-03-04 02:31:28 +00:00
2001-08-01 02:52:57 +00:00
# include "nsIAccessible.h"
2001-03-04 02:31:28 +00:00
# include "nsRootAccessible.h"
# include "nsCOMPtr.h"
# include "nsIDocument.h"
2001-09-24 22:43:23 +00:00
# include "nsIDOMNSDocument.h"
2001-03-04 02:31:28 +00:00
# include "nsIPresShell.h"
# include "nsIPresContext.h"
# include "nsIContent.h"
# include "nsIFrame.h"
2001-04-17 23:06:38 +00:00
# include "nsIDOMEventTarget.h"
# include "nsIDOMElement.h"
2001-12-06 06:57:03 +00:00
# include "nsIDOMNSEvent.h"
2001-04-17 23:06:38 +00:00
# include "nsIDOMEventReceiver.h"
2001-09-25 08:34:42 +00:00
# include "nsIDOMEventListener.h"
2001-04-17 23:06:38 +00:00
# include "nsReadableUtils.h"
2001-05-11 21:11:38 +00:00
# include "nsILink.h"
# include "nsHTMLFormControlAccessible.h"
# include "nsHTMLLinkAccessible.h"
# include "nsIURI.h"
2001-08-01 02:52:57 +00:00
# include "nsIDocShell.h"
2001-05-11 21:11:38 +00:00
# include "nsIDocShellTreeItem.h"
2001-10-02 21:36:38 +00:00
# include "nsIWebNavigation.h"
2001-06-30 00:25:09 +00:00
# include "nsIXULDocument.h"
# include "nsIDOMDocument.h"
# include "nsIDOMDocumentType.h"
# include "nsINameSpaceManager.h"
# include "nsIDOMNSHTMLSelectElement.h"
# include "nsString.h"
# include "nsXPIDLString.h"
2001-08-14 06:01:48 +00:00
# include "nsIAccessibilityService.h"
# include "nsIServiceManager.h"
2001-11-07 00:12:16 +00:00
# include "nsHTMLSelectAccessible.h"
2001-08-14 06:01:48 +00:00
# include "nsIDOMHTMLSelectElement.h"
2001-09-25 08:34:42 +00:00
# include "nsCURILoader.h"
# include "nsIInterfaceRequestorUtils.h"
2001-10-26 23:47:52 +00:00
# include "nsIScriptGlobalObject.h"
2002-05-08 20:21:03 +00:00
# include "nsIDOMWindow.h"
# include "nsIViewManager.h"
# include "nsIScrollableView.h"
2001-12-11 20:49:49 +00:00
# include "nsIDOMXULSelectCntrlEl.h"
# include "nsIDOMXULSelectCntrlItemEl.h"
2002-05-13 07:19:43 +00:00
# include "nsXULTreeAccessible.h"
# include "nsITreeSelection.h"
# include "nsAccessibilityService.h"
2002-06-25 22:54:23 +00:00
# include "nsISelectionPrivate.h"
# include "nsICaret.h"
# include "nsIAccessibleCaret.h"
2002-07-05 06:20:15 +00:00
# include "nsIDOMHTMLInputElement.h"
# include "nsAccessibleEventData.h"
2001-04-17 23:06:38 +00:00
NS_INTERFACE_MAP_BEGIN ( nsRootAccessible )
2001-06-30 00:25:09 +00:00
NS_INTERFACE_MAP_ENTRY ( nsIAccessibleDocument )
2001-04-17 23:06:38 +00:00
NS_INTERFACE_MAP_ENTRY ( nsIAccessibleEventReceiver )
2001-05-11 21:11:38 +00:00
NS_INTERFACE_MAP_ENTRY ( nsIDOMFocusListener )
NS_INTERFACE_MAP_ENTRY ( nsIDOMFormListener )
2001-09-25 08:34:42 +00:00
NS_INTERFACE_MAP_ENTRY ( nsISupportsWeakReference )
NS_INTERFACE_MAP_ENTRY ( nsITimerCallback )
NS_INTERFACE_MAP_ENTRY ( nsIWebProgressListener )
2002-05-08 20:21:03 +00:00
NS_INTERFACE_MAP_ENTRY ( nsIScrollPositionListener )
2001-05-17 21:28:37 +00:00
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS ( nsISupports , nsIDOMFormListener )
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS ( nsIDOMEventListener , nsIDOMFormListener )
2001-04-17 23:06:38 +00:00
NS_INTERFACE_MAP_END_INHERITING ( nsAccessible )
2001-06-30 00:25:09 +00:00
2001-04-17 23:06:38 +00:00
NS_IMPL_ADDREF_INHERITED ( nsRootAccessible , nsAccessible ) ;
NS_IMPL_RELEASE_INHERITED ( nsRootAccessible , nsAccessible ) ;
2001-03-04 02:31:28 +00:00
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
nsIDOMNode * nsRootAccessible : : gLastFocusedNode = 0 ; // Strong reference
PRUint32 nsRootAccessible : : gInstanceCount = 0 ;
//#define DEBUG_LEAKS 1 // aaronl debug
2001-03-04 02:31:28 +00:00
//-----------------------------------------------------
// construction
//-----------------------------------------------------
2001-08-14 06:01:48 +00:00
nsRootAccessible : : nsRootAccessible ( nsIWeakReference * aShell ) : nsAccessible ( nsnull , aShell ) ,
2002-07-08 07:56:50 +00:00
nsDocAccessibleMixin ( aShell ) , mListener ( nsnull ) ,
mAccService ( do_GetService ( " @mozilla.org/accessibilityService;1 " ) ) ,
mBusy ( eBusyStateUninitialized ) , mScrollPositionChangedTicks ( 0 ) , mScrollablePresShells ( nsnull )
2001-03-04 02:31:28 +00:00
{
2001-05-11 21:11:38 +00:00
nsCOMPtr < nsIPresShell > shell ( do_QueryReferent ( mPresShell ) ) ;
2001-10-12 21:05:31 +00:00
if ( shell ) {
shell - > GetDocument ( getter_AddRefs ( mDocument ) ) ;
mDOMNode = do_QueryInterface ( mDocument ) ;
}
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
+ + gInstanceCount ;
# ifdef DEBUG_LEAKS
printf ( " =====> %d nsRootAccessible's %x \n " , gInstanceCount , ( PRUint32 ) this ) ;
# endif
2001-03-04 02:31:28 +00:00
}
//-----------------------------------------------------
// destruction
//-----------------------------------------------------
nsRootAccessible : : ~ nsRootAccessible ( )
{
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
if ( - - gInstanceCount = = 0 )
NS_IF_RELEASE ( gLastFocusedNode ) ;
# ifdef DEBUG_LEAKS
printf ( " ======> %d nsRootAccessible's %x \n " , gInstanceCount , ( PRUint32 ) this ) ;
# endif
2001-09-25 08:34:42 +00:00
RemoveAccessibleEventListener ( ) ;
2002-05-08 20:21:03 +00:00
if ( mScrollablePresShells )
delete mScrollablePresShells ;
2001-03-04 02:31:28 +00:00
}
/* attribute wstring accName; */
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsRootAccessible : : GetAccName ( nsAString & aAccName )
2001-03-04 02:31:28 +00:00
{
2001-06-30 00:25:09 +00:00
return GetTitle ( aAccName ) ;
2001-03-04 02:31:28 +00:00
}
// helpers
nsIFrame * nsRootAccessible : : GetFrame ( )
{
2001-05-11 21:11:38 +00:00
nsCOMPtr < nsIPresShell > shell ( do_QueryReferent ( mPresShell ) ) ;
2001-06-30 00:25:09 +00:00
2001-05-11 21:11:38 +00:00
nsIFrame * root = nsnull ;
if ( shell )
shell - > GetRootFrame ( & root ) ;
return root ;
}
2001-05-17 23:52:32 +00:00
void nsRootAccessible : : GetBounds ( nsRect & aBounds , nsIFrame * * aRelativeFrame )
2001-05-11 21:11:38 +00:00
{
2001-05-17 23:52:32 +00:00
* aRelativeFrame = GetFrame ( ) ;
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
if ( * aRelativeFrame )
( * aRelativeFrame ) - > GetRect ( aBounds ) ;
2001-03-04 02:31:28 +00:00
}
2001-05-11 21:11:38 +00:00
/* readonly attribute nsIAccessible accParent; */
2001-03-04 02:31:28 +00:00
NS_IMETHODIMP nsRootAccessible : : GetAccParent ( nsIAccessible * * aAccParent )
{
* aAccParent = nsnull ;
return NS_OK ;
}
2001-05-11 21:11:38 +00:00
/* readonly attribute unsigned long accRole; */
NS_IMETHODIMP nsRootAccessible : : GetAccRole ( PRUint32 * aAccRole )
2001-03-04 02:31:28 +00:00
{
2001-05-11 21:11:38 +00:00
nsCOMPtr < nsIPresShell > shell ( do_QueryReferent ( mPresShell ) ) ;
2001-06-30 00:25:09 +00:00
if ( ! shell ) {
* aAccRole = 0 ;
return NS_ERROR_FAILURE ;
}
2001-08-01 02:52:57 +00:00
/*
// Commenting this out for now.
2001-11-20 02:29:14 +00:00
// It was requested that we always use MSAA ROLE_PANE objects instead of client objects.
2001-08-01 02:52:57 +00:00
// However, it might be asked that we put client objects back.
2001-05-11 21:11:38 +00:00
nsCOMPtr < nsIPresContext > context ;
shell - > GetPresContext ( getter_AddRefs ( context ) ) ;
nsCOMPtr < nsISupports > container ;
context - > GetContainer ( getter_AddRefs ( container ) ) ;
if ( container ) {
nsCOMPtr < nsIDocShellTreeItem > parentTreeItem , docTreeItem ( do_QueryInterface ( container ) ) ;
if ( docTreeItem ) {
docTreeItem - > GetSameTypeParent ( getter_AddRefs ( parentTreeItem ) ) ;
// Basically, if this docshell has a parent of the same type, it's a frame
if ( parentTreeItem ) {
* aAccRole = ROLE_PANE ;
return NS_OK ;
}
}
}
* aAccRole = ROLE_CLIENT ;
2001-08-01 02:52:57 +00:00
*/
* aAccRole = ROLE_PANE ;
2002-03-10 05:12:39 +00:00
// If it's a <dialog>, use ROLE_DIALOG instead
nsCOMPtr < nsIContent > rootContent ;
mDocument - > GetRootContent ( getter_AddRefs ( rootContent ) ) ;
if ( rootContent ) {
nsCOMPtr < nsIDOMElement > rootElement ( do_QueryInterface ( rootContent ) ) ;
if ( rootElement ) {
nsAutoString name ;
rootElement - > GetLocalName ( name ) ;
if ( name . Equals ( NS_LITERAL_STRING ( " dialog " ) ) )
* aAccRole = ROLE_DIALOG ;
}
}
2001-09-25 08:34:42 +00:00
return NS_OK ;
2001-03-04 02:31:28 +00:00
}
2001-04-17 23:06:38 +00:00
2001-08-01 02:52:57 +00:00
NS_IMETHODIMP nsRootAccessible : : GetAccState ( PRUint32 * aAccState )
{
2001-09-25 08:34:42 +00:00
* aAccState = STATE_FOCUSABLE ;
if ( mBusy = = eBusyStateLoading )
* aAccState | = STATE_BUSY ;
return NS_OK ;
2001-08-01 02:52:57 +00:00
}
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsRootAccessible : : GetAccValue ( nsAString & aAccValue )
2001-05-11 21:11:38 +00:00
{
2001-06-30 00:25:09 +00:00
return GetURL ( aAccValue ) ;
2001-05-11 21:11:38 +00:00
}
2001-05-17 21:28:37 +00:00
2002-09-07 05:38:16 +00:00
NS_IMETHODIMP nsRootAccessible : : Notify ( nsITimer * timer )
2001-09-25 08:34:42 +00:00
{
2002-05-08 20:21:03 +00:00
if ( mScrollPositionChangedTicks ) {
if ( + + mScrollPositionChangedTicks > 2 ) {
// Whenever scroll position changes, mScrollPositionChangeTicks gets reset to 1
// We only want to fire accessibilty scroll event when scrolling stops or pauses
// Therefore, we wait for no scroll events to occur between 2 ticks of this timer
// That indicates a pause in scrolling, so we fire the accessibilty scroll event
nsCOMPtr < nsIPresShell > presShell ( do_QueryReferent ( mLastScrolledPresShell ) ) ;
if ( mListener & & presShell ) {
nsCOMPtr < nsIAccessible > docAccessible ;
if ( mPresShell = = mLastScrolledPresShell )
docAccessible = this ; // Fast way, don't need to create new accessible to fire event on the root
else {
// Need to create accessible for document that had scrolling occur in it
nsCOMPtr < nsIDocument > doc ;
presShell - > GetDocument ( getter_AddRefs ( doc ) ) ;
nsCOMPtr < nsIDOMNode > docNode ( do_QueryInterface ( doc ) ) ;
mAccService - > GetAccessibleFor ( docNode , getter_AddRefs ( docAccessible ) ) ;
}
if ( docAccessible )
2002-06-25 05:04:17 +00:00
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_SCROLLINGEND , docAccessible , nsnull ) ;
2002-05-08 20:21:03 +00:00
}
mScrollPositionChangedTicks = 0 ;
mLastScrolledPresShell = nsnull ;
}
}
2002-09-07 05:38:16 +00:00
return NS_OK ;
2002-05-08 20:21:03 +00:00
}
void nsRootAccessible : : AddScrollListener ( nsIPresShell * aPresShell )
{
nsCOMPtr < nsIViewManager > vm ;
if ( aPresShell )
aPresShell - > GetViewManager ( getter_AddRefs ( vm ) ) ;
nsIScrollableView * scrollableView = nsnull ;
if ( vm )
vm - > GetRootScrollableView ( & scrollableView ) ;
if ( ! scrollableView )
return ;
if ( ! mScrollablePresShells )
mScrollablePresShells = new nsSupportsHashtable ( SCROLL_HASH_START_SIZE , PR_TRUE ) ; // PR_TRUE = thread safe hash table
if ( mScrollablePresShells ) {
nsISupportsKey key ( scrollableView ) ;
nsCOMPtr < nsISupports > supports ( dont_AddRef ( NS_STATIC_CAST ( nsISupports * , mScrollablePresShells - > Get ( & key ) ) ) ) ;
if ( supports ) // This scroll view is already being listened to, remove it. We will re-add it w/ current pres shell
RemoveScrollListener ( aPresShell ) ;
// Add to hash table, so we can retrieve correct pres shell later
nsCOMPtr < nsIWeakReference > weakShell ;
weakShell = do_GetWeakReference ( aPresShell ) ;
mScrollablePresShells - > Put ( & key , weakShell ) ;
// Add listener
scrollableView - > AddScrollPositionListener ( NS_STATIC_CAST ( nsIScrollPositionListener * , this ) ) ;
}
}
void nsRootAccessible : : RemoveScrollListener ( nsIPresShell * aPresShell )
{
nsCOMPtr < nsIViewManager > vm ;
if ( aPresShell )
aPresShell - > GetViewManager ( getter_AddRefs ( vm ) ) ;
nsIScrollableView * scrollableView = nsnull ;
if ( vm )
vm - > GetRootScrollableView ( & scrollableView ) ;
if ( scrollableView )
scrollableView - > RemoveScrollPositionListener ( NS_STATIC_CAST ( nsIScrollPositionListener * , this ) ) ;
if ( mScrollablePresShells ) {
nsISupportsKey key ( scrollableView ) ;
nsCOMPtr < nsISupports > supp ;
mScrollablePresShells - > Remove ( & key , getter_AddRefs ( supp ) ) ;
}
}
PRBool PR_CALLBACK
RemoveScrollListenerEnum ( nsHashKey * aKey , void * aData , void * aClosure )
{
nsCOMPtr < nsIPresShell > presShell ( do_QueryReferent ( NS_STATIC_CAST ( nsIWeakReference * , aData ) ) ) ;
// If presShell gone, then our nsIScrollPositionListener will also already be gone
if ( presShell ) {
nsCOMPtr < nsIViewManager > vm ;
if ( presShell )
presShell - > GetViewManager ( getter_AddRefs ( vm ) ) ;
nsIScrollableView * scrollableView = nsnull ;
if ( vm )
vm - > GetRootScrollableView ( & scrollableView ) ;
if ( scrollableView )
scrollableView - > RemoveScrollPositionListener ( NS_STATIC_CAST ( nsIScrollPositionListener * , aClosure ) ) ;
}
return PR_TRUE ;
}
NS_IMETHODIMP nsRootAccessible : : ScrollPositionWillChange ( nsIScrollableView * aView , nscoord aX , nscoord aY )
{
return NS_OK ;
}
NS_IMETHODIMP nsRootAccessible : : ScrollPositionDidChange ( nsIScrollableView * aScrollableView , nscoord aX , nscoord aY )
{
if ( mListener ) {
if ( ! mScrollablePresShells )
return NS_OK ;
nsISupportsKey key ( aScrollableView ) ;
nsCOMPtr < nsIWeakReference > weakShell ( dont_AddRef ( NS_STATIC_CAST ( nsIWeakReference * , mScrollablePresShells - > Get ( & key ) ) ) ) ;
if ( ! weakShell )
return NS_OK ;
if ( mTimer & & ( mBusy ! = eBusyStateDone | | ( mScrollPositionChangedTicks & & mLastScrolledPresShell ! = weakShell ) ) ) {
// We need to say finish up our current time work and start a new timer
// either because we haven't yet fired our finished loading event, or
// a scroll event from another pres shell is still waiting to be fired
Notify ( mTimer ) ;
mTimer - > Cancel ( ) ;
}
// Start new timer, if the timer cycles at least 1 full cycle without more scroll position changes,
// then the ::Notify() method will fire the accessibility event for scroll position changes
nsresult rv ;
mTimer = do_CreateInstance ( " @mozilla.org/timer;1 " , & rv ) ;
if ( NS_SUCCEEDED ( rv ) ) {
const PRUint32 kScrollPosCheckWait = 50 ;
2002-09-07 05:38:16 +00:00
mTimer - > InitWithCallback ( NS_STATIC_CAST ( nsITimerCallback * , this ) , kScrollPosCheckWait , nsITimer : : TYPE_REPEATING_SLACK ) ;
2002-05-08 20:21:03 +00:00
}
mScrollPositionChangedTicks = 1 ;
mLastScrolledPresShell = weakShell ;
}
return NS_OK ;
2001-09-25 08:34:42 +00:00
}
2001-04-17 23:06:38 +00:00
/* void addAccessibleEventListener (in nsIAccessibleEventListener aListener); */
NS_IMETHODIMP nsRootAccessible : : AddAccessibleEventListener ( nsIAccessibleEventListener * aListener )
{
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
NS_ASSERTION ( aListener , " Trying to add a null listener! " ) ;
2001-09-25 08:34:42 +00:00
if ( mListener )
return NS_OK ;
2001-09-25 04:52:14 +00:00
2001-09-25 08:34:42 +00:00
mListener = aListener ;
// use AddEventListener from the nsIDOMEventTarget interface
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
nsCOMPtr < nsIDOMEventTarget > target ( do_QueryInterface ( mDocument ) ) ;
2001-09-25 08:34:42 +00:00
if ( target ) {
// capture DOM focus events
nsresult rv = target - > AddEventListener ( NS_LITERAL_STRING ( " focus " ) , NS_STATIC_CAST ( nsIDOMFocusListener * , this ) , PR_TRUE ) ;
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to register listener " ) ;
// capture Form change events
2002-10-25 02:00:18 +00:00
rv = target - > AddEventListener ( NS_LITERAL_STRING ( " select " ) , NS_STATIC_CAST ( nsIDOMFormListener * , this ) , PR_TRUE ) ;
2001-09-25 08:34:42 +00:00
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to register listener " ) ;
2002-02-18 07:35:10 +00:00
2001-09-25 08:34:42 +00:00
// add ourself as a CheckboxStateChange listener (custom event fired in nsHTMLInputElement.cpp)
rv = target - > AddEventListener ( NS_LITERAL_STRING ( " CheckboxStateChange " ) , NS_STATIC_CAST ( nsIDOMFormListener * , this ) , PR_TRUE ) ;
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to register listener " ) ;
2002-02-18 07:35:10 +00:00
// add ourself as a RadioStateChange Listener ( custom event fired in in nsHTMLInputElement.cpp & radio.xml)
rv = target - > AddEventListener ( NS_LITERAL_STRING ( " RadioStateChange " ) , NS_STATIC_CAST ( nsIDOMFormListener * , this ) , PR_TRUE ) ;
2001-09-25 08:34:42 +00:00
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to register listener " ) ;
2002-02-18 07:35:10 +00:00
rv = target - > AddEventListener ( NS_LITERAL_STRING ( " ListitemStateChange " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
2001-12-11 20:49:49 +00:00
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to register listener " ) ;
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
rv = target - > AddEventListener ( NS_LITERAL_STRING ( " popupshowing " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to register listener " ) ;
rv = target - > AddEventListener ( NS_LITERAL_STRING ( " popuphiding " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to register listener " ) ;
rv = target - > AddEventListener ( NS_LITERAL_STRING ( " DOMMenuItemActive " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to register listener " ) ;
2002-07-03 16:38:15 +00:00
rv = target - > AddEventListener ( NS_LITERAL_STRING ( " DOMMenuBarActive " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to register listener " ) ;
rv = target - > AddEventListener ( NS_LITERAL_STRING ( " DOMMenuBarInactive " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
NS_ASSERTION ( NS_SUCCEEDED ( rv ) , " failed to register listener " ) ;
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
// Set up web progress listener - we need to know when page loading is finished
2001-11-20 02:29:14 +00:00
// That way we can send the STATE_CHANGE events for the MSAA root "pane" object (ROLE_PANE),
// and change the STATE_BUSY bit flag
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
nsCOMPtr < nsIPresShell > presShell ( do_QueryReferent ( mPresShell ) ) ;
2001-11-20 02:29:14 +00:00
if ( presShell ) {
nsCOMPtr < nsIPresContext > context ;
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
presShell - > GetPresContext ( getter_AddRefs ( context ) ) ;
2001-11-20 02:29:14 +00:00
if ( context ) {
nsCOMPtr < nsISupports > container ; context - > GetContainer ( getter_AddRefs ( container ) ) ;
nsCOMPtr < nsIDocShell > docShell ( do_QueryInterface ( container ) ) ;
if ( docShell ) {
mWebProgress = do_GetInterface ( docShell ) ;
2002-05-16 20:57:37 +00:00
mWebProgress - > AddProgressListener ( this , nsIWebProgress : : NOTIFY_LOCATION |
nsIWebProgress : : NOTIFY_STATE_DOCUMENT ) ;
2001-11-20 02:29:14 +00:00
}
}
}
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
NS_ASSERTION ( mWebProgress , " Could not get nsIWebProgress for nsRootAccessible " ) ;
2001-09-25 08:34:42 +00:00
}
2001-09-25 05:54:10 +00:00
2002-06-25 22:54:23 +00:00
if ( ! mCaretAccessible & & mListener )
mAccService - > CreateCaretAccessible ( mDOMNode , mListener , getter_AddRefs ( mCaretAccessible ) ) ;
2001-04-17 23:06:38 +00:00
return NS_OK ;
}
2001-09-25 08:34:42 +00:00
/* void removeAccessibleEventListener (); */
NS_IMETHODIMP nsRootAccessible : : RemoveAccessibleEventListener ( )
2001-04-17 23:06:38 +00:00
{
2001-09-25 08:34:42 +00:00
if ( mListener ) {
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
nsCOMPtr < nsIDOMEventTarget > target ( do_QueryInterface ( mDocument ) ) ;
if ( target ) {
target - > RemoveEventListener ( NS_LITERAL_STRING ( " focus " ) , NS_STATIC_CAST ( nsIDOMFocusListener * , this ) , PR_TRUE ) ;
2002-10-25 02:00:18 +00:00
target - > RemoveEventListener ( NS_LITERAL_STRING ( " select " ) , NS_STATIC_CAST ( nsIDOMFormListener * , this ) , PR_TRUE ) ;
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
target - > RemoveEventListener ( NS_LITERAL_STRING ( " CheckboxStateChange " ) , NS_STATIC_CAST ( nsIDOMFormListener * , this ) , PR_TRUE ) ;
target - > RemoveEventListener ( NS_LITERAL_STRING ( " popupshowing " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
target - > RemoveEventListener ( NS_LITERAL_STRING ( " popuphiding " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
target - > RemoveEventListener ( NS_LITERAL_STRING ( " DOMMenuItemActive " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
2002-07-03 16:38:15 +00:00
target - > RemoveEventListener ( NS_LITERAL_STRING ( " DOMMenuBarActive " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
target - > RemoveEventListener ( NS_LITERAL_STRING ( " DOMMenuBarInactive " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
2002-02-18 07:35:10 +00:00
target - > RemoveEventListener ( NS_LITERAL_STRING ( " RadioStateChange " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
target - > RemoveEventListener ( NS_LITERAL_STRING ( " ListitemStateChange " ) , NS_STATIC_CAST ( nsIDOMXULListener * , this ) , PR_TRUE ) ;
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
}
if ( mTimer ) {
mTimer - > Cancel ( ) ;
mTimer = nsnull ;
2001-09-25 08:34:42 +00:00
}
2001-04-17 23:06:38 +00:00
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
if ( mWebProgress ) {
mWebProgress - > RemoveProgressListener ( this ) ;
mWebProgress = nsnull ;
}
2002-05-08 20:21:03 +00:00
if ( mScrollablePresShells )
mScrollablePresShells - > Enumerate ( RemoveScrollListenerEnum , NS_STATIC_CAST ( nsIScrollPositionListener * , this ) ) ;
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
mListener = nsnull ;
}
2001-04-17 23:06:38 +00:00
2002-06-25 22:54:23 +00:00
if ( mCaretAccessible ) {
mCaretAccessible - > RemoveSelectionListener ( ) ;
mCaretAccessible = nsnull ;
}
return NS_OK ;
}
NS_IMETHODIMP nsRootAccessible : : GetCaretAccessible ( nsIAccessibleCaret * * aCaretAccessible )
{
* aCaretAccessible = mCaretAccessible ;
NS_IF_ADDREF ( * aCaretAccessible ) ;
2001-04-17 23:06:38 +00:00
return NS_OK ;
}
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
void nsRootAccessible : : FireAccessibleFocusEvent ( nsIAccessible * focusAccessible , nsIDOMNode * focusNode )
{
2002-07-05 06:20:15 +00:00
if ( focusAccessible & & focusNode & & gLastFocusedNode ! = focusNode ) {
2002-06-25 05:04:17 +00:00
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_FOCUS , focusAccessible , nsnull ) ;
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
NS_IF_RELEASE ( gLastFocusedNode ) ;
gLastFocusedNode = focusNode ;
NS_ADDREF ( gLastFocusedNode ) ;
2002-06-25 22:54:23 +00:00
if ( mCaretAccessible )
mCaretAccessible - > AttachNewSelectionListener ( focusNode ) ;
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
}
}
2001-05-11 21:11:38 +00:00
// --------------- nsIDOMEventListener Methods (3) ------------------------
2001-04-17 23:06:38 +00:00
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 16:46:42 +00:00
NS_IMETHODIMP nsRootAccessible : : HandleEvent ( nsIDOMEvent * aEvent )
2001-04-17 23:06:38 +00:00
{
if ( mListener ) {
2001-08-14 06:01:48 +00:00
// optionTargetNode is set to current option for HTML selects
nsCOMPtr < nsIDOMNode > targetNode , optionTargetNode ;
nsresult rv = GetTargetNode ( aEvent , targetNode ) ;
if ( NS_FAILED ( rv ) )
return rv ;
// Check to see if it's a select element. If so, need the currently focused option
nsCOMPtr < nsIDOMHTMLSelectElement > selectElement ( do_QueryInterface ( targetNode ) ) ;
if ( selectElement ) // ----- Target Node is an HTML <select> element ------
2002-04-04 23:27:45 +00:00
nsHTMLSelectOptionAccessible : : GetFocusedOptionNode ( targetNode , optionTargetNode ) ;
2001-05-11 21:11:38 +00:00
2001-12-11 20:49:49 +00:00
// for focus events on Radio Groups we give the focus to the selected button
nsCOMPtr < nsIDOMXULSelectControlElement > selectControl ( do_QueryInterface ( targetNode ) ) ;
if ( selectControl ) {
nsCOMPtr < nsIDOMXULSelectControlItemElement > selectItem ;
selectControl - > GetSelectedItem ( getter_AddRefs ( selectItem ) ) ;
optionTargetNode = do_QueryInterface ( selectItem ) ;
}
2002-09-17 03:51:40 +00:00
nsCOMPtr < nsIAccessible > accessible ;
if ( NS_FAILED ( mAccService - > GetAccessibleFor ( targetNode , getter_AddRefs ( accessible ) ) ) )
return NS_OK ;
2002-05-13 07:19:43 +00:00
// If it's a tree element, need the currently selected item
PRInt32 treeIndex = - 1 ;
nsCOMPtr < nsITreeBoxObject > treeBox ;
2002-09-17 03:51:40 +00:00
nsCOMPtr < nsIAccessible > treeItemAccessible ;
2002-05-13 07:19:43 +00:00
nsXULTreeAccessible : : GetTreeBoxObject ( targetNode , getter_AddRefs ( treeBox ) ) ;
if ( treeBox ) {
nsCOMPtr < nsITreeSelection > selection ;
treeBox - > GetSelection ( getter_AddRefs ( selection ) ) ;
2002-09-17 03:51:40 +00:00
if ( selection ) {
2002-05-13 07:19:43 +00:00
selection - > GetCurrentIndex ( & treeIndex ) ;
2002-09-17 03:51:40 +00:00
if ( treeIndex > = 0 ) {
nsCOMPtr < nsIWeakReference > weakShell ;
nsAccessibilityService : : GetShellFromNode ( targetNode , getter_AddRefs ( weakShell ) ) ;
treeItemAccessible = new nsXULTreeitemAccessible ( accessible , targetNode , weakShell , treeIndex ) ;
if ( ! treeItemAccessible )
return NS_ERROR_OUT_OF_MEMORY ;
}
}
2002-05-13 07:19:43 +00:00
}
2001-05-11 21:11:38 +00:00
nsAutoString eventType ;
aEvent - > GetType ( eventType ) ;
2002-07-05 06:20:15 +00:00
# ifndef MOZ_ACCESSIBILITY_ATK
2002-09-17 03:51:40 +00:00
// tree event
if ( treeItemAccessible & &
( eventType . EqualsIgnoreCase ( " DOMMenuItemActive " ) | | eventType . EqualsIgnoreCase ( " select " ) ) ) {
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_FOCUS , treeItemAccessible , nsnull ) ;
return NS_OK ;
}
2002-05-13 07:19:43 +00:00
2002-09-17 03:51:40 +00:00
if ( eventType . EqualsIgnoreCase ( " focus " ) | | eventType . EqualsIgnoreCase ( " DOMMenuItemActive " ) ) {
if ( optionTargetNode & &
NS_SUCCEEDED ( mAccService - > GetAccessibleFor ( optionTargetNode , getter_AddRefs ( accessible ) ) ) ) {
2002-07-03 16:38:15 +00:00
FireAccessibleFocusEvent ( accessible , optionTargetNode ) ;
2002-02-18 07:35:10 +00:00
}
2002-09-17 03:51:40 +00:00
else
FireAccessibleFocusEvent ( accessible , targetNode ) ;
}
else if ( eventType . EqualsIgnoreCase ( " ListitemStateChange " ) ) {
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_STATE_CHANGE , accessible , nsnull ) ;
FireAccessibleFocusEvent ( accessible , optionTargetNode ) ;
}
else if ( eventType . EqualsIgnoreCase ( " CheckboxStateChange " ) ) {
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_STATE_CHANGE , accessible , nsnull ) ;
}
else if ( eventType . EqualsIgnoreCase ( " RadioStateChange " ) ) {
// first the XUL radio buttons
if ( targetNode & &
NS_SUCCEEDED ( mAccService - > GetAccessibleFor ( targetNode , getter_AddRefs ( accessible ) ) ) ) {
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_STATE_CHANGE , accessible , nsnull ) ;
FireAccessibleFocusEvent ( accessible , targetNode ) ;
2002-02-18 07:35:10 +00:00
}
2002-09-17 03:51:40 +00:00
else { // for the html radio buttons -- apparently the focus code just works. :-)
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_STATE_CHANGE , accessible , nsnull ) ;
2001-12-11 20:49:49 +00:00
}
2002-09-17 03:51:40 +00:00
}
else if ( eventType . EqualsIgnoreCase ( " popupshowing " ) )
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_MENUPOPUPSTART , accessible , nsnull ) ;
else if ( eventType . EqualsIgnoreCase ( " popuphiding " ) )
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_MENUPOPUPEND , accessible , nsnull ) ;
else if ( eventType . EqualsIgnoreCase ( " DOMMenuBarActive " ) )
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_MENUSTART , accessible , nsnull ) ;
else if ( eventType . EqualsIgnoreCase ( " DOMMenuBarInactive " ) ) {
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_MENUEND , accessible , nsnull ) ;
GetAccFocused ( getter_AddRefs ( accessible ) ) ;
if ( accessible ) {
accessible - > AccGetDOMNode ( getter_AddRefs ( targetNode ) ) ;
FireAccessibleFocusEvent ( accessible , targetNode ) ;
2002-07-03 16:38:15 +00:00
}
2002-09-17 03:51:40 +00:00
}
2002-07-05 06:20:15 +00:00
# else
2002-09-17 03:51:40 +00:00
AtkStateChange stateData ;
AtkTextChange textData ;
if ( eventType . EqualsIgnoreCase ( " focus " ) | | eventType . EqualsIgnoreCase ( " DOMMenuItemActive " ) ) {
if ( treeItemAccessible ) // use focused treeitem
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_FOCUS , treeItemAccessible , nsnull ) ;
else if ( optionTargetNode & & // use focused option
NS_SUCCEEDED ( mAccService - > GetAccessibleFor ( optionTargetNode , getter_AddRefs ( accessible ) ) ) )
FireAccessibleFocusEvent ( accessible , optionTargetNode ) ;
else
FireAccessibleFocusEvent ( accessible , targetNode ) ;
}
else if ( eventType . EqualsIgnoreCase ( " change " ) ) {
if ( selectElement ) // it's a HTML <select>
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_ATK_SELECTION_CHANGE , accessible , nsnull ) ;
else {
nsCOMPtr < nsIDOMHTMLInputElement > inputElement ( do_QueryInterface ( targetNode ) ) ;
if ( inputElement ) { // it's a HTML <input>
accessible - > GetAccState ( & stateData . state ) ;
stateData . enable = ( stateData . state & STATE_CHECKED ) ! = 0 ;
stateData . state = STATE_CHECKED ;
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_STATE_CHANGE , accessible , ( AccessibleEventData * ) & stateData ) ;
2002-07-05 06:20:15 +00:00
}
}
2001-05-11 21:11:38 +00:00
}
2002-09-17 03:51:40 +00:00
else if ( eventType . EqualsIgnoreCase ( " select " ) ) {
if ( selectControl ) // it's a XUL <listbox>
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_ATK_SELECTION_CHANGE , accessible , nsnull ) ;
else if ( treeBox & & treeIndex > = 0 ) // it's a XUL <tree>
// use EVENT_FOCUS instead of EVENT_ATK_SELECTION_CHANGE
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_FOCUS , treeItemAccessible , nsnull ) ;
}
else if ( eventType . EqualsIgnoreCase ( " input " ) ) {
// XXX kyle.yuan@sun.com future work, put correct values for text change data
textData . start = 0 ;
textData . length = 0 ;
textData . add = PR_TRUE ;
nsAutoString accName ;
accessible - > GetAccValue ( accName ) ;
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_ATK_TEXT_CHANGE , accessible , ( AccessibleEventData * ) & textData ) ;
}
else if ( eventType . EqualsIgnoreCase ( " ListitemStateChange " ) ) // it's a XUL <listbox>
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_FOCUS , accessible , nsnull ) ;
else if ( eventType . EqualsIgnoreCase ( " CheckboxStateChange " ) | | // it's a XUL <checkbox>
eventType . EqualsIgnoreCase ( " RadioStateChange " ) ) { // it's a XUL <radio>
accessible - > GetAccState ( & stateData . state ) ;
stateData . enable = ( stateData . state & STATE_CHECKED ) ! = 0 ;
stateData . state = STATE_CHECKED ;
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_STATE_CHANGE , accessible , ( AccessibleEventData * ) & stateData ) ;
}
else if ( eventType . EqualsIgnoreCase ( " popupshowing " ) )
FireAccessibleFocusEvent ( accessible , targetNode ) ;
else if ( eventType . EqualsIgnoreCase ( " popuphiding " ) )
FireAccessibleFocusEvent ( accessible , targetNode ) ;
# endif
2001-05-11 21:11:38 +00:00
}
return NS_OK ;
}
2001-04-17 23:06:38 +00:00
2001-08-14 06:01:48 +00:00
NS_IMETHODIMP nsRootAccessible : : GetTargetNode ( nsIDOMEvent * aEvent , nsCOMPtr < nsIDOMNode > & aTargetNode )
{
nsCOMPtr < nsIDOMEventTarget > domEventTarget ;
2001-12-06 06:57:03 +00:00
nsCOMPtr < nsIDOMNSEvent > nsevent ( do_QueryInterface ( aEvent ) ) ;
if ( nsevent ) {
nsevent - > GetOriginalTarget ( getter_AddRefs ( domEventTarget ) ) ;
}
2001-08-14 06:01:48 +00:00
nsresult rv ;
aTargetNode = do_QueryInterface ( domEventTarget , & rv ) ;
return rv ;
}
2001-06-30 00:25:09 +00:00
// ------- nsIDOMFocusListener Methods (1) -------------
2001-05-17 21:28:37 +00:00
2001-05-11 21:11:38 +00:00
NS_IMETHODIMP nsRootAccessible : : Focus ( nsIDOMEvent * aEvent )
{
return HandleEvent ( aEvent ) ;
}
2001-04-17 23:06:38 +00:00
2002-06-25 05:04:17 +00:00
NS_IMETHODIMP nsRootAccessible : : Blur ( nsIDOMEvent * aEvent )
{
return NS_OK ;
}
2001-04-17 23:06:38 +00:00
2001-05-11 21:11:38 +00:00
// ------- nsIDOMFormListener Methods (5) -------------
2001-05-17 21:28:37 +00:00
2002-06-25 05:04:17 +00:00
NS_IMETHODIMP nsRootAccessible : : Submit ( nsIDOMEvent * aEvent )
{
return NS_OK ;
}
2001-04-17 23:06:38 +00:00
2002-06-25 05:04:17 +00:00
NS_IMETHODIMP nsRootAccessible : : Reset ( nsIDOMEvent * aEvent )
{
return NS_OK ;
}
2001-04-17 23:06:38 +00:00
2001-05-11 21:11:38 +00:00
NS_IMETHODIMP nsRootAccessible : : Change ( nsIDOMEvent * aEvent )
{
// get change events when the form elements changes its state, checked->not,
2001-05-17 21:28:37 +00:00
// deleted text, new text, change in selection for list/combo boxes
// this may be the event that we have the individual Accessible objects
// handle themselves -- have list/combos figure out the change in selection
// have textareas and inputs fire a change of state etc...
2002-10-25 02:00:18 +00:00
# ifdef MOZ_ACCESSIBILITY_ATK
2001-05-11 21:11:38 +00:00
return HandleEvent ( aEvent ) ;
2002-10-25 02:00:18 +00:00
# else
return NS_OK ; // Ignore form change events in MSAA
# endif
2001-04-17 23:06:38 +00:00
}
2001-05-17 21:28:37 +00:00
// gets Select events when text is selected in a textarea or input
2002-05-13 07:19:43 +00:00
NS_IMETHODIMP nsRootAccessible : : Select ( nsIDOMEvent * aEvent )
{
return HandleEvent ( aEvent ) ;
}
2001-05-11 21:11:38 +00:00
2001-05-17 21:28:37 +00:00
// gets Input events when text is entered or deleted in a textarea or input
2002-06-25 05:04:17 +00:00
NS_IMETHODIMP nsRootAccessible : : Input ( nsIDOMEvent * aEvent )
{
2002-07-05 06:20:15 +00:00
# ifndef MOZ_ACCESSIBILITY_ATK
2002-06-25 05:04:17 +00:00
return NS_OK ;
2002-07-05 06:20:15 +00:00
# else
return HandleEvent ( aEvent ) ;
# endif
2002-06-25 05:04:17 +00:00
}
2001-05-11 21:11:38 +00:00
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
// ------- nsIDOMXULListener Methods (8) ---------------
NS_IMETHODIMP nsRootAccessible : : PopupShowing ( nsIDOMEvent * aEvent ) { return NS_OK ; }
NS_IMETHODIMP nsRootAccessible : : PopupShown ( nsIDOMEvent * aEvent ) { return NS_OK ; }
NS_IMETHODIMP nsRootAccessible : : PopupHiding ( nsIDOMEvent * aEvent ) { return NS_OK ; }
NS_IMETHODIMP nsRootAccessible : : PopupHidden ( nsIDOMEvent * aEvent ) { return NS_OK ; }
NS_IMETHODIMP nsRootAccessible : : Close ( nsIDOMEvent * aEvent ) { return NS_OK ; }
NS_IMETHODIMP nsRootAccessible : : Command ( nsIDOMEvent * aEvent ) { return NS_OK ; }
NS_IMETHODIMP nsRootAccessible : : Broadcast ( nsIDOMEvent * aEvent ) { return NS_OK ; }
NS_IMETHODIMP nsRootAccessible : : CommandUpdate ( nsIDOMEvent * aEvent ) { return NS_OK ; }
2001-06-30 00:25:09 +00:00
// ------- nsIAccessibleDocument Methods (5) ---------------
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsRootAccessible : : GetURL ( nsAString & aURL )
2001-06-30 00:25:09 +00:00
{
return nsDocAccessibleMixin : : GetURL ( aURL ) ;
}
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsRootAccessible : : GetTitle ( nsAString & aTitle )
2001-06-30 00:25:09 +00:00
{
return nsDocAccessibleMixin : : GetTitle ( aTitle ) ;
}
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsRootAccessible : : GetMimeType ( nsAString & aMimeType )
2001-06-30 00:25:09 +00:00
{
return nsDocAccessibleMixin : : GetMimeType ( aMimeType ) ;
}
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsRootAccessible : : GetDocType ( nsAString & aDocType )
2001-06-30 00:25:09 +00:00
{
return nsDocAccessibleMixin : : GetDocType ( aDocType ) ;
}
2001-04-17 23:06:38 +00:00
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsRootAccessible : : GetNameSpaceURIForID ( PRInt16 aNameSpaceID , nsAString & aNameSpaceURI )
2001-06-30 00:25:09 +00:00
{
return nsDocAccessibleMixin : : GetNameSpaceURIForID ( aNameSpaceID , aNameSpaceURI ) ;
}
NS_IMETHODIMP nsRootAccessible : : GetDocument ( nsIDocument * * doc )
{
return nsDocAccessibleMixin : : GetDocument ( doc ) ;
}
2001-09-25 08:34:42 +00:00
NS_IMETHODIMP nsRootAccessible : : OnStateChange ( nsIWebProgress * aWebProgress ,
2002-05-16 20:57:37 +00:00
nsIRequest * aRequest , PRUint32 aStateFlags , nsresult aStatus )
2001-09-25 08:34:42 +00:00
{
2002-05-08 20:21:03 +00:00
if ( ( aStateFlags & STATE_IS_DOCUMENT ) & & ( aStateFlags & STATE_STOP ) ) {
2002-08-06 07:37:49 +00:00
// Doc is ready!
if ( mBusy ! = eBusyStateDone ) {
mBusy = eBusyStateDone ;
2002-09-17 03:51:40 +00:00
# ifndef MOZ_ACCESSIBILITY_ATK
2002-08-06 07:37:49 +00:00
if ( mListener )
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_STATE_CHANGE , this , nsnull ) ;
2002-09-17 03:51:40 +00:00
# endif
2002-08-06 07:37:49 +00:00
}
2002-05-08 20:21:03 +00:00
// Set up scroll position listener
nsCOMPtr < nsIDOMWindow > domWin ;
aWebProgress - > GetDOMWindow ( getter_AddRefs ( domWin ) ) ;
if ( domWin ) {
nsCOMPtr < nsIDOMDocument > domDoc ;
domWin - > GetDocument ( getter_AddRefs ( domDoc ) ) ;
nsCOMPtr < nsIDocument > doc ( do_QueryInterface ( domDoc ) ) ;
if ( doc ) {
nsCOMPtr < nsIPresShell > presShell ;
doc - > GetShellAt ( 0 , getter_AddRefs ( presShell ) ) ;
AddScrollListener ( presShell ) ;
}
}
}
2001-09-25 08:34:42 +00:00
return NS_OK ;
}
/* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
NS_IMETHODIMP nsRootAccessible : : OnProgressChange ( nsIWebProgress * aWebProgress ,
nsIRequest * aRequest , PRInt32 aCurSelfProgress , PRInt32 aMaxSelfProgress ,
PRInt32 aCurTotalProgress , PRInt32 aMaxTotalProgress )
{
2002-05-16 20:57:37 +00:00
NS_NOTREACHED ( " notification excluded in AddProgressListener(...) " ) ;
2001-09-25 08:34:42 +00:00
return NS_OK ;
}
/* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location); */
NS_IMETHODIMP nsRootAccessible : : OnLocationChange ( nsIWebProgress * aWebProgress ,
nsIRequest * aRequest , nsIURI * location )
{
// Load has been verified, it will occur, about to commence
2002-05-08 20:21:03 +00:00
if ( mBusy ! = eBusyStateLoading ) {
2001-10-02 08:07:40 +00:00
mBusy = eBusyStateLoading ;
2002-09-17 03:51:40 +00:00
# ifndef MOZ_ACCESSIBILITY_ATK
2002-05-08 20:21:03 +00:00
if ( mListener )
2002-06-25 05:04:17 +00:00
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_STATE_CHANGE , this , nsnull ) ;
2002-09-17 03:51:40 +00:00
# else
if ( mListener ) {
AtkChildrenChange childrenData ;
childrenData . index = - 1 ;
childrenData . child = 0 ;
childrenData . add = PR_FALSE ;
mListener - > HandleEvent ( nsIAccessibleEventListener : : EVENT_REORDER , this , ( AccessibleEventData * ) & childrenData ) ;
}
# endif
2002-05-08 20:21:03 +00:00
// Document is going away, remove its scroll position listener
nsCOMPtr < nsIDOMWindow > domWin ;
aWebProgress - > GetDOMWindow ( getter_AddRefs ( domWin ) ) ;
if ( domWin ) {
nsCOMPtr < nsIDOMDocument > domDoc ;
domWin - > GetDocument ( getter_AddRefs ( domDoc ) ) ;
nsCOMPtr < nsIDocument > doc ( do_QueryInterface ( domDoc ) ) ;
if ( doc ) {
nsCOMPtr < nsIPresShell > presShell ;
doc - > GetShellAt ( 0 , getter_AddRefs ( presShell ) ) ;
RemoveScrollListener ( presShell ) ;
}
}
2001-10-02 08:07:40 +00:00
}
2001-09-25 08:34:42 +00:00
return NS_OK ;
}
/* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
NS_IMETHODIMP nsRootAccessible : : OnStatusChange ( nsIWebProgress * aWebProgress ,
nsIRequest * aRequest , nsresult aStatus , const PRUnichar * aMessage )
{
2002-05-16 20:57:37 +00:00
NS_NOTREACHED ( " notification excluded in AddProgressListener(...) " ) ;
2001-09-25 08:34:42 +00:00
return NS_OK ;
}
2002-05-16 20:57:37 +00:00
/* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */
2001-09-25 08:34:42 +00:00
NS_IMETHODIMP nsRootAccessible : : OnSecurityChange ( nsIWebProgress * aWebProgress ,
2002-05-16 20:57:37 +00:00
nsIRequest * aRequest , PRUint32 state )
2001-09-25 08:34:42 +00:00
{
2002-05-16 20:57:37 +00:00
NS_NOTREACHED ( " notification excluded in AddProgressListener(...) " ) ;
2001-09-25 08:34:42 +00:00
return NS_OK ;
}
2001-06-30 00:25:09 +00:00
nsDocAccessibleMixin : : nsDocAccessibleMixin ( nsIDocument * aDoc ) : mDocument ( aDoc )
{
}
nsDocAccessibleMixin : : nsDocAccessibleMixin ( nsIWeakReference * aPresShell )
{
nsCOMPtr < nsIPresShell > shell ( do_QueryReferent ( aPresShell ) ) ;
2001-10-12 21:05:31 +00:00
if ( shell )
shell - > GetDocument ( getter_AddRefs ( mDocument ) ) ;
2001-06-30 00:25:09 +00:00
}
nsDocAccessibleMixin : : ~ nsDocAccessibleMixin ( )
{
}
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsDocAccessibleMixin : : GetURL ( nsAString & aURL )
2001-06-30 00:25:09 +00:00
{
2001-10-02 21:36:38 +00:00
nsCOMPtr < nsIPresShell > presShell ;
mDocument - > GetShellAt ( 0 , getter_AddRefs ( presShell ) ) ;
Bug 109851, bug 108629, bug 109921, bug 109977, bug 109153, bug 109187, bug 109213, bug 109221. Check in latest XUL accessibility support - menus, <colorpicker>, <progressmeter>, <groupbox>, mixed states for checkboxes, buttons that can be 'checked' ie pressed down, fixes extra MSAA events being generated, couldn't see HTML content
2001-11-20 02:05:26 +00:00
if ( ! presShell )
return NS_ERROR_FAILURE ;
2001-10-02 21:36:38 +00:00
nsCOMPtr < nsIDocShell > docShell ;
2001-10-26 23:47:52 +00:00
GetDocShellFromPS ( presShell , getter_AddRefs ( docShell ) ) ;
2001-10-02 21:36:38 +00:00
nsCOMPtr < nsIWebNavigation > webNav ( do_GetInterface ( docShell ) ) ;
2002-03-06 07:48:55 +00:00
nsCAutoString theURL ;
2001-10-02 21:36:38 +00:00
if ( webNav ) {
nsCOMPtr < nsIURI > pURI ;
webNav - > GetCurrentURI ( getter_AddRefs ( pURI ) ) ;
if ( pURI )
2002-03-06 07:48:55 +00:00
pURI - > GetSpec ( theURL ) ;
2001-10-02 21:36:38 +00:00
}
//XXXaaronl Need to use CopyUTF8toUCS2(nsDependentCString(theURL), aURL); when it's written
2002-03-06 07:48:55 +00:00
aURL . Assign ( NS_ConvertUTF8toUCS2 ( theURL ) ) ;
2001-06-30 00:25:09 +00:00
return NS_OK ;
}
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsDocAccessibleMixin : : GetTitle ( nsAString & aTitle )
2001-06-30 00:25:09 +00:00
{
// This doesn't leak - we don't own the const pointer that's returned
aTitle = * ( mDocument - > GetDocumentTitle ( ) ) ;
return NS_OK ;
}
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsDocAccessibleMixin : : GetMimeType ( nsAString & aMimeType )
2001-06-30 00:25:09 +00:00
{
2001-09-25 05:54:10 +00:00
nsCOMPtr < nsIDOMNSDocument > domnsDocument ( do_QueryInterface ( mDocument ) ) ;
if ( domnsDocument ) {
return domnsDocument - > GetContentType ( aMimeType ) ;
}
return NS_ERROR_FAILURE ;
2001-06-30 00:25:09 +00:00
}
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsDocAccessibleMixin : : GetDocType ( nsAString & aDocType )
2001-06-30 00:25:09 +00:00
{
nsCOMPtr < nsIXULDocument > xulDoc ( do_QueryInterface ( mDocument ) ) ;
nsCOMPtr < nsIDOMDocument > domDoc ( do_QueryInterface ( mDocument ) ) ;
nsCOMPtr < nsIDOMDocumentType > docType ;
if ( xulDoc ) {
aDocType = NS_LITERAL_STRING ( " window " ) ; // doctype not implemented for XUL at time of writing - causes assertion
return NS_OK ;
}
else if ( domDoc & & NS_SUCCEEDED ( domDoc - > GetDoctype ( getter_AddRefs ( docType ) ) ) & & docType ) {
return docType - > GetName ( aDocType ) ;
}
return NS_ERROR_FAILURE ;
}
2002-03-23 21:52:27 +00:00
NS_IMETHODIMP nsDocAccessibleMixin : : GetNameSpaceURIForID ( PRInt16 aNameSpaceID , nsAString & aNameSpaceURI )
2001-06-30 00:25:09 +00:00
{
if ( mDocument ) {
nsCOMPtr < nsINameSpaceManager > nameSpaceManager ;
if ( NS_SUCCEEDED ( mDocument - > GetNameSpaceManager ( * getter_AddRefs ( nameSpaceManager ) ) ) )
return nameSpaceManager - > GetNameSpaceURI ( aNameSpaceID , aNameSpaceURI ) ;
}
return NS_ERROR_FAILURE ;
}
NS_IMETHODIMP nsDocAccessibleMixin : : GetDocument ( nsIDocument * * doc )
{
* doc = mDocument ;
if ( mDocument ) {
NS_IF_ADDREF ( * doc ) ;
return NS_OK ;
}
return NS_ERROR_FAILURE ;
}
2001-04-17 23:06:38 +00:00
2001-08-01 02:52:57 +00:00
2001-10-26 23:47:52 +00:00
NS_IMETHODIMP nsDocAccessibleMixin : : GetDocShellFromPS ( nsIPresShell * aPresShell , nsIDocShell * * aDocShell )
{
* aDocShell = nsnull ;
if ( aPresShell ) {
nsCOMPtr < nsIDocument > doc ;
aPresShell - > GetDocument ( getter_AddRefs ( doc ) ) ;
if ( doc ) {
nsCOMPtr < nsIScriptGlobalObject > scriptObj ;
doc - > GetScriptGlobalObject ( getter_AddRefs ( scriptObj ) ) ;
if ( scriptObj ) {
scriptObj - > GetDocShell ( aDocShell ) ;
if ( * aDocShell )
return NS_OK ;
}
}
}
return NS_ERROR_FAILURE ;
}
2002-05-08 20:21:03 +00:00
2002-06-25 22:54:23 +00:00
NS_IMETHODIMP nsDocAccessibleMixin : : GetCaretAccessible ( nsIAccessibleCaret * * aCaretAccessible )
{
// Caret only owned by top level window's document
* aCaretAccessible = nsnull ;
return NS_OK ;
}