diff --git a/accessible/src/base/nsAccessNode.cpp b/accessible/src/base/nsAccessNode.cpp index 34655238262..fb37d6a499b 100755 --- a/accessible/src/base/nsAccessNode.cpp +++ b/accessible/src/base/nsAccessNode.cpp @@ -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 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 nsAccessNode::GetPresShell() diff --git a/accessible/src/base/nsAccessNode.h b/accessible/src/base/nsAccessNode.h index 6d90f61d9ac..190d55ac042 100755 --- a/accessible/src/base/nsAccessNode.h +++ b/accessible/src/base/nsAccessNode.h @@ -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; diff --git a/layout/base/nsIPresShell.h b/layout/base/nsIPresShell.h index 473a1f9ccc0..d524aed5f1f 100644 --- a/layout/base/nsIPresShell.h +++ b/layout/base/nsIPresShell.h @@ -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 diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index 05a34695052..b1c612d3e64 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -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 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; }