author | Eitan Isaacson <eitan@monotonous.org> |
Fri, 04 Nov 2011 09:54:45 -0400 | |
changeset 83377 | 7b2dd926316ce205f91a0e5c0cabdfe74988a553 |
parent 83376 | e2dc4acd3a685debd05b5889b89468e198519e45 |
child 83378 | 2d86eea1a4cb141f641bc3307b2ebf332a81464a |
push id | 519 |
push user | akeybl@mozilla.com |
push date | Wed, 01 Feb 2012 00:38:35 +0000 |
treeherder | mozilla-beta@788ea1ef610b [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | blassey |
bugs | 699243 |
milestone | 10.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
widget/src/android/nsWindow.cpp | file | annotate | diff | comparison | revisions | |
widget/src/android/nsWindow.h | file | annotate | diff | comparison | revisions |
--- a/widget/src/android/nsWindow.cpp +++ b/widget/src/android/nsWindow.cpp @@ -79,16 +79,20 @@ using mozilla::unused; using namespace mozilla; NS_IMPL_ISUPPORTS_INHERITED0(nsWindow, nsBaseWidget) // The dimensions of the current android view static gfxIntSize gAndroidBounds; static gfxIntSize gAndroidScreenBounds; +#ifdef ACCESSIBILITY +bool nsWindow::sAccessibilityEnabled = false; +#endif + class ContentCreationNotifier; static nsCOMPtr<ContentCreationNotifier> gContentCreationNotifier; // A helper class to send updates when content processes // are created. Currently an update for the screen size is sent. class ContentCreationNotifier : public nsIObserver { NS_DECL_ISUPPORTS @@ -172,27 +176,35 @@ nsWindow::DumpWindows(const nsTArray<nsW DumpWindows(w->mChildren, indent+1); } } nsWindow::nsWindow() : mIsVisible(false), mParent(nsnull), mFocus(nsnull), +#ifdef ACCESSIBILITY + mRootAccessible(nsnull), +#endif mIMEComposing(false) { } nsWindow::~nsWindow() { gTopLevelWindows.RemoveElement(this); nsWindow *top = FindTopLevel(); if (top->mFocus == this) top->mFocus = nsnull; ALOG("nsWindow %p destructor", (void*)this); + +#ifdef ACCESSIBILITY + if (mRootAccessible) + mRootAccessible = nsnull; +#endif } bool nsWindow::IsTopLevel() { return mWindowType == eWindowType_toplevel || mWindowType == eWindowType_dialog || mWindowType == eWindowType_invisible; @@ -370,23 +382,62 @@ nsWindow::Show(bool aState) win->BringToFront(); break; } } } else if (FindTopLevel() == TopWindow()) { nsAppShell::gAppShell->PostEvent(new AndroidGeckoEvent(-1, -1, -1, -1)); } +#ifdef ACCESSIBILITY + static bool sAccessibilityChecked = false; + + if (!sAccessibilityChecked) { + sAccessibilityChecked = true; + sAccessibilityEnabled = + AndroidBridge::Bridge()->GetAccessibilityEnabled(); + } + + if (aState && sAccessibilityEnabled) + CreateRootAccessible(); +#endif + #ifdef DEBUG_ANDROID_WIDGET DumpWindows(); #endif return NS_OK; } +#ifdef ACCESSIBILITY +void +nsWindow::CreateRootAccessible() +{ + if (IsTopLevel() && !mRootAccessible) { + ALOG(("nsWindow:: Create Toplevel Accessibility\n")); + nsAccessible *acc = DispatchAccessibleEvent(); + + if (acc) { + mRootAccessible = acc; + } + } +} + +nsAccessible* +nsWindow::DispatchAccessibleEvent() +{ + nsAccessibleEvent event(true, NS_GETACCESSIBLE, this); + + nsEventStatus status; + DispatchEvent(&event, status); + + return event.mAccessible; +} +#endif + NS_IMETHODIMP nsWindow::SetModal(bool aState) { ALOG("nsWindow[%p]::SetModal %d ignored", (void*)this, aState); return NS_OK; }
--- a/widget/src/android/nsWindow.h +++ b/widget/src/android/nsWindow.h @@ -38,16 +38,20 @@ #ifndef NSWINDOW_H_ #define NSWINDOW_H_ #include "nsBaseWidget.h" #include "gfxPoint.h" #include "nsTArray.h" +#ifdef ACCESSIBILITY +#include "nsAccessible.h" +#endif + class gfxASurface; class nsIdleService; namespace mozilla { class AndroidGeckoEvent; class AndroidKeyEvent; } @@ -163,16 +167,19 @@ public: LayerManager* GetLayerManager (PLayersChild* aShadowManager = nsnull, LayersBackend aBackendHint = LayerManager::LAYERS_NONE, LayerManagerPersistence aPersistence = LAYER_MANAGER_CURRENT, bool* aAllowRetaining = nsnull); gfxASurface* GetThebesSurface(); NS_IMETHOD ReparentNativeWidget(nsIWidget* aNewParent); +#ifdef ACCESSIBILITY + static bool sAccessibilityEnabled; +#endif protected: void BringToFront(); nsWindow *FindTopLevel(); bool DrawTo(gfxASurface *targetSurface); bool DrawToFile(const nsAString &path); bool IsTopLevel(); void OnIMEAddRange(mozilla::AndroidGeckoEvent *ae); @@ -208,11 +215,26 @@ protected: static void LogWindow(nsWindow *win, int index, int indent); private: void InitKeyEvent(nsKeyEvent& event, mozilla::AndroidGeckoEvent& key); void DispatchGestureEvent(mozilla::AndroidGeckoEvent *ae); void DispatchGestureEvent(PRUint32 msg, PRUint32 direction, double delta, const nsIntPoint &refPoint, PRUint64 time); void HandleSpecialKey(mozilla::AndroidGeckoEvent *ae); + +#ifdef ACCESSIBILITY + nsRefPtr<nsAccessible> mRootAccessible; + + /** + * Request to create the accessible for this window if it is top level. + */ + void CreateRootAccessible(); + + /** + * Generate the NS_GETACCESSIBLE event to get accessible for this window + * and return it. + */ + nsAccessible *DispatchAccessibleEvent(); +#endif // ACCESSIBILITY }; #endif /* NSWINDOW_H_ */