Bug 357583. Allow XPCOM clients to init accessibility when they use nsIAccessible. r=surkov, sr=roc

This commit is contained in:
aaronleventhal%moonset.net 2007-05-03 19:22:24 +00:00
Родитель 32949a6427
Коммит 7a83b690b4
4 изменённых файлов: 34 добавлений и 4 удалений

Просмотреть файл

@ -65,6 +65,7 @@
#include "nsITimer.h"
#include "nsRootAccessible.h"
#include "nsIFocusController.h"
#include "nsIObserverService.h"
/* For documentation of the accessibility architecture,
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
@ -224,6 +225,20 @@ void nsAccessNode::InitXPAccessibility()
}
gIsAccessibilityActive = PR_TRUE;
NotifyA11yInitOrShutdown();
}
void nsAccessNode::NotifyA11yInitOrShutdown()
{
nsCOMPtr<nsIObserverService> obsService =
do_GetService("@mozilla.org/observer-service;1");
NS_ASSERTION(obsService, "No observer service to notify of a11y init/shutdown");
if (obsService) {
static const PRUnichar kInitIndicator[] = { '1', 0 };
static const PRUnichar kShutdownIndicator[] = { '0', 0 };
obsService->NotifyObservers(nsnull, "a11y-init-or-shutdown",
gIsAccessibilityActive ? kInitIndicator : kShutdownIndicator);
}
}
void nsAccessNode::ShutdownXPAccessibility()
@ -244,6 +259,7 @@ void nsAccessNode::ShutdownXPAccessibility()
ClearCache(gGlobalDocAccessibleCache);
gIsAccessibilityActive = PR_FALSE;
NotifyA11yInitOrShutdown();
}
already_AddRefed<nsIPresShell> nsAccessNode::GetPresShell()

Просмотреть файл

@ -165,6 +165,11 @@ protected:
PRBool mIsInitialized;
#endif
/**
* Notify global nsIObserver's that a11y is getting init'd or shutdown
*/
static void NotifyA11yInitOrShutdown();
// Static data, we do our own refcounting for our static data
static nsIStringBundle *gStringBundle;
static nsIStringBundle *gKeyStringBundle;

Просмотреть файл

@ -636,7 +636,8 @@ public:
virtual void VerifyStyleTree() = 0;
#endif
PRBool IsAccessibilityActive() { return mIsAccessibilityActive; }
static PRBool gIsAccessibilityActive;
static PRBool IsAccessibilityActive() { return gIsAccessibilityActive; }
/**
* Stop all active elements (plugins and the caret) in this presentation and

Просмотреть файл

@ -204,6 +204,8 @@
static NS_DEFINE_CID(kCSSStyleSheetCID, NS_CSS_STYLESHEET_CID);
static NS_DEFINE_IID(kRangeCID, NS_RANGE_CID);
PRBool nsIPresShell::gIsAccessibilityActive = PR_FALSE;
// convert a color value to a string, in the CSS format #RRGGBB
// * - initially created for bugs 31816, 20760, 22963
static void ColorToString(nscolor aColor, nsAutoString &aString);
@ -1419,7 +1421,6 @@ NS_NewPresShell(nsIPresShell** aInstancePtrResult)
PresShell::PresShell()
{
mIsAccessibilityActive = PR_FALSE;
mSelection = nsnull;
#ifdef MOZ_REFLOW_PERF
mReflowCountMgr = new ReflowCountMgr();
@ -1577,6 +1578,9 @@ PresShell::Init(nsIDocument* aDocument,
os->AddObserver(this, "user-sheet-removed", PR_FALSE);
#ifdef MOZ_XUL
os->AddObserver(this, "chrome-flush-skin-caches", PR_FALSE);
#endif
#ifdef ACCESSIBILITY
os->AddObserver(this, "a11y-init-or-shutdown", PR_FALSE);
#endif
}
}
@ -3343,7 +3347,7 @@ PresShell::CancelAllPendingReflows()
#ifdef ACCESSIBILITY
void nsIPresShell::InvalidateAccessibleSubtree(nsIContent *aContent)
{
if (mIsAccessibilityActive) {
if (gIsAccessibilityActive) {
nsCOMPtr<nsIAccessibilityService> accService =
do_GetService("@mozilla.org/accessibilityService;1");
if (accService) {
@ -5678,7 +5682,6 @@ PresShell::HandleEventInternal(nsEvent* aEvent, nsIView *aView,
// We'll make sure the right number of Addref's occur before
// handing this back to the accessibility client
NS_STATIC_CAST(nsAccessibleEvent*, aEvent)->accessible = acc;
mIsAccessibilityActive = PR_TRUE;
return NS_OK;
}
}
@ -6397,6 +6400,11 @@ PresShell::Observe(nsISupports* aSubject,
return NS_OK;
}
#ifdef ACCESSIBILITY
if (!nsCRT::strcmp(aTopic, "a11y-init-or-shutdown")) {
gIsAccessibilityActive = aData && *aData == '1';
}
#endif
NS_WARNING("unrecognized topic in PresShell::Observe");
return NS_ERROR_FAILURE;
}