SessionAccessibility.h (5529B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef mozilla_a11y_SessionAccessibility_h_ 7 #define mozilla_a11y_SessionAccessibility_h_ 8 9 #include "mozilla/java/SessionAccessibilityNatives.h" 10 #include "mozilla/widget/GeckoViewSupport.h" 11 #include "nsAppShell.h" 12 #include "nsThreadUtils.h" 13 #include "nsWindow.h" 14 15 namespace mozilla { 16 namespace a11y { 17 18 class Accessible; 19 20 class SessionAccessibility final 21 : public java::SessionAccessibility::NativeProvider::Natives< 22 SessionAccessibility> { 23 public: 24 typedef java::SessionAccessibility::NativeProvider::Natives< 25 SessionAccessibility> 26 Base; 27 28 SessionAccessibility( 29 jni::NativeWeakPtr<widget::GeckoViewSupport> aWindow, 30 java::SessionAccessibility::NativeProvider::Param aSessionAccessibility); 31 32 void OnWeakNonIntrusiveDetach(already_AddRefed<Runnable> aDisposer) { 33 SetAttached(false, std::move(aDisposer)); 34 } 35 36 const java::SessionAccessibility::NativeProvider::Ref& 37 GetJavaAccessibility() { 38 return mSessionAccessibility; 39 } 40 41 static void Init(); 42 static RefPtr<SessionAccessibility> GetInstanceFor(Accessible* aAccessible); 43 static RefPtr<SessionAccessibility> GetInstanceFor(PresShell* aPresShell); 44 45 // Native implementations 46 using Base::AttachNative; 47 using Base::DisposeNative; 48 void GetNodeInfo(int32_t aID, mozilla::jni::Object::Param aNodeInfo); 49 int GetNodeClassName(int32_t aID); 50 void SetText(int32_t aID, jni::String::Param aText); 51 void Click(int32_t aID); 52 bool Pivot(int32_t aID, int32_t aGranularity, bool aForward, bool aInclusive); 53 void ExploreByTouch(int32_t aID, float aX, float aY); 54 bool NavigateText(int32_t aID, int32_t aGranularity, int32_t aStartOffset, 55 int32_t aEndOffset, bool aForward, bool aSelect); 56 void SetSelection(int32_t aID, int32_t aStart, int32_t aEnd); 57 void Cut(int32_t aID); 58 void Copy(int32_t aID); 59 MOZ_CAN_RUN_SCRIPT_BOUNDARY void Paste(int32_t aID); 60 void StartNativeAccessibility(); 61 62 // Event methods 63 void SendFocusEvent(Accessible* aAccessible); 64 void SendScrollingEvent(Accessible* aAccessible, int32_t aScrollX, 65 int32_t aScrollY, int32_t aMaxScrollX, 66 int32_t aMaxScrollY); 67 MOZ_CAN_RUN_SCRIPT_BOUNDARY 68 void SendAccessibilityFocusedEvent(Accessible* aAccessible, 69 bool aScrollIntoView); 70 void SendHoverEnterEvent(Accessible* aAccessible); 71 void SendTextSelectionChangedEvent(Accessible* aAccessible, 72 int32_t aCaretOffset); 73 void SendTextTraversedEvent(Accessible* aAccessible, int32_t aStartOffset, 74 int32_t aEndOffset); 75 void SendTextChangedEvent(Accessible* aAccessible, const nsAString& aStr, 76 int32_t aStart, uint32_t aLen, bool aIsInsert, 77 bool aFromUser); 78 void SendSelectedEvent(Accessible* aAccessible, bool aSelected); 79 void SendClickedEvent(Accessible* aAccessible, uint32_t aFlags); 80 void SendWindowContentChangedEvent(); 81 void SendWindowStateChangedEvent(Accessible* aAccessible); 82 void SendAnnouncementEvent(Accessible* aAccessible, 83 const nsAString& aAnnouncement, 84 uint16_t aPriority); 85 86 Accessible* GetAccessibleByID(int32_t aID) const; 87 88 static const int32_t kNoID = -1; 89 static const int32_t kUnsetID = 0; 90 91 static void RegisterAccessible(Accessible* aAccessible); 92 static void UnregisterAccessible(Accessible* aAccessible); 93 static void UnregisterAll(PresShell* aPresShell); 94 95 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SessionAccessibility) 96 97 private: 98 ~SessionAccessibility() {} 99 100 void PopulateNodeInfo(Accessible* aAccessible, 101 mozilla::jni::Object::Param aNodeInfo); 102 103 void SetAttached(bool aAttached, already_AddRefed<Runnable> aRunnable); 104 105 bool DoNavigateText(Accessible* aAccessible, int32_t aGranularity, 106 int32_t aStartOffset, int32_t aEndOffset, bool aForward, 107 bool aSelect); 108 109 jni::NativeWeakPtr<widget::GeckoViewSupport> mWindow; // Parent only 110 java::SessionAccessibility::NativeProvider::GlobalRef mSessionAccessibility; 111 112 class IDMappingEntry { 113 public: 114 explicit IDMappingEntry(Accessible* aAccessible); 115 116 IDMappingEntry& operator=(Accessible* aAccessible); 117 118 operator Accessible*() const; 119 120 private: 121 // A strong reference to a DocAccessible or DocAccessibleParent. They don't 122 // share any useful base class except nsISupports, so we use that. 123 // When we retrieve the document from this reference we cast it to 124 // LocalAccessible in the DocAccessible case because DocAccessible has 125 // multiple inheritance paths for nsISupports. 126 RefPtr<nsISupports> mDoc; 127 // The ID of the accessible as used in the internal doc mapping. 128 // We rely on this ID being pointer derived and therefore divisible by two 129 // so we can use the first bit to mark if it is remote or not. 130 uint64_t mInternalID; 131 132 static const uintptr_t IS_REMOTE = 0x1; 133 }; 134 135 /* 136 * This provides a mapping from 32 bit id to accessible objects. 137 */ 138 nsBaseHashtable<nsUint32HashKey, IDMappingEntry, Accessible*> 139 mIDToAccessibleMap; 140 }; 141 142 } // namespace a11y 143 } // namespace mozilla 144 145 #endif