mozilla::ipc::IPCResult DocAccessibleParent::RecvSelectionEvent(const uint64_t& aID, const uint64_t& aWidgetID, const uint32_t& aType) { if (mShutdown) { return IPC_OK(); } ProxyAccessible* target = GetAccessible(aID); ProxyAccessible* widget = GetAccessible(aWidgetID); if (!target || !widget) { NS_ERROR("invalid id in selection event"); return IPC_OK(); } ProxySelectionEvent(target, widget, aType); if (!nsCoreUtils::AccEventObserversExist()) { return IPC_OK(); } xpcAccessibleGeneric* xpcTarget = GetXPCAccessible(target); xpcAccessibleDocument* xpcDoc = GetAccService()->GetXPCDocument(this); RefPtr<xpcAccEvent> event = new xpcAccEvent(aType, xpcTarget, xpcDoc, nullptr, false); nsCoreUtils::DispatchAccEvent(Move(event)); return IPC_OK(); }
bool DocAccessibleParent::RecvTextChangeEvent(const uint64_t& aID, const nsString& aStr, const int32_t& aStart, const uint32_t& aLen, const bool& aIsInsert, const bool& aFromUser) { ProxyAccessible* target = GetAccessible(aID); if (!target) { NS_ERROR("text change event target is unknown!"); return true; } ProxyTextChangeEvent(target, aStr, aStart, aLen, aIsInsert, aFromUser); if (!nsCoreUtils::AccEventObserversExist()) { return true; } xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(target); xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this); uint32_t type = aIsInsert ? nsIAccessibleEvent::EVENT_TEXT_INSERTED : nsIAccessibleEvent::EVENT_TEXT_REMOVED; nsIDOMNode* node = nullptr; RefPtr<xpcAccTextChangeEvent> event = new xpcAccTextChangeEvent(type, xpcAcc, doc, node, aFromUser, aStart, aLen, aIsInsert, aStr); nsCoreUtils::DispatchAccEvent(Move(event)); return true; }
bool DocAccessibleParent::RecvCaretMoveEvent(const uint64_t& aID, const int32_t& aOffset) { ProxyAccessible* proxy = GetAccessible(aID); if (!proxy) { NS_ERROR("unknown caret move event target!"); return true; } ProxyCaretMoveEvent(proxy, aOffset); if (!nsCoreUtils::AccEventObserversExist()) { return true; } xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(proxy); xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this); nsIDOMNode* node = nullptr; bool fromUser = true; // XXX fix me uint32_t type = nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED; RefPtr<xpcAccCaretMoveEvent> event = new xpcAccCaretMoveEvent(type, xpcAcc, doc, node, fromUser, aOffset); nsCoreUtils::DispatchAccEvent(Move(event)); return true; }
bool DocAccessibleParent::RecvStateChangeEvent(const uint64_t& aID, const uint64_t& aState, const bool& aEnabled) { ProxyAccessible* target = GetAccessible(aID); if (!target) { NS_ERROR("we don't know about the target of a state change event!"); return true; } ProxyStateChangeEvent(target, aState, aEnabled); if (!nsCoreUtils::AccEventObserversExist()) { return true; } xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(target); xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this); uint32_t type = nsIAccessibleEvent::EVENT_STATE_CHANGE; bool extra; uint32_t state = nsAccUtils::To32States(aState, &extra); bool fromUser = true; // XXX fix this nsIDOMNode* node = nullptr; // XXX can we do better? RefPtr<xpcAccStateChangeEvent> event = new xpcAccStateChangeEvent(type, xpcAcc, doc, node, fromUser, state, extra, aEnabled); nsCoreUtils::DispatchAccEvent(Move(event)); return true; }
bool DocAccessibleParent::RecvEvent(const uint64_t& aID, const uint32_t& aEventType) { ProxyAccessible* proxy = GetAccessible(aID); if (!proxy) { NS_ERROR("no proxy for event!"); return true; } ProxyEvent(proxy, aEventType); if (!nsCoreUtils::AccEventObserversExist()) { return true; } xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(proxy); xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this); nsIDOMNode* node = nullptr; bool fromUser = true; // XXX fix me RefPtr<xpcAccEvent> event = new xpcAccEvent(aEventType, xpcAcc, doc, node, fromUser); nsCoreUtils::DispatchAccEvent(Move(event)); return true; }
NS_IMETHODIMP nsAccessibleTreeWalker::GetNextSibling() { // Make sure mState.prevState and mState.siblingIndex are initialized so we can walk forward NS_ASSERTION(mState.prevState && mState.siblingIndex != eSiblingsUninitialized, "Error - GetNextSibling() only works after a GetFirstChild(), so we must have a prevState."); mState.accessible = nsnull; while (PR_TRUE) { // Get next frame UpdateFrame(PR_FALSE); GetNextDOMNode(); if (!mState.domNode) { // Done with current siblings PopState(); // Use parent - go up in stack. Can always pop state because we have to start with a GetFirstChild(). if (!mState.prevState) { mState.accessible = nsnull; break; // Back to original accessible that we did GetFirstChild() from } } else if ((mState.domNode != mState.prevState->domNode && GetAccessible()) || NS_SUCCEEDED(GetFirstChild())) { return NS_OK; // if next is accessible, use it } } return NS_ERROR_FAILURE; }
mozilla::ipc::IPCResult DocAccessibleParent::RecvFocusEvent(const uint64_t& aID, const LayoutDeviceIntRect& aCaretRect) { if (mShutdown) { return IPC_OK(); } ProxyAccessible* proxy = GetAccessible(aID); if (!proxy) { NS_ERROR("no proxy for event!"); return IPC_OK(); } ProxyFocusEvent(proxy, aCaretRect); if (!nsCoreUtils::AccEventObserversExist()) { return IPC_OK(); } xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(proxy); xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this); nsIDOMNode* node = nullptr; bool fromUser = true; // XXX fix me RefPtr<xpcAccEvent> event = new xpcAccEvent(nsIAccessibleEvent::EVENT_FOCUS, xpcAcc, doc, node, fromUser); nsCoreUtils::DispatchAccEvent(Move(event)); return IPC_OK(); }
void TimeTextCtrl::Updated() { wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId()); event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); #if wxUSE_ACCESSIBILITY GetAccessible()->NotifyEvent(wxACC_EVENT_OBJECT_NAMECHANGE, this, wxOBJID_CLIENT, mFocusedDigit + 1); SetFieldFocus(mFocusedDigit); #endif }
void TimeTextCtrl::SetFieldFocus(int digit) { #if wxUSE_ACCESSIBILITY mFocusedDigit = digit; mLastField = mDigits[mFocusedDigit].field + 1; // This looks strange (and it is), but it was the only way I could come // up with that allowed Jaws, Window-Eyes, and NVDA to read the control // somewhat the same. See TimeTextCtrlAx below for even more odd looking // hackery. // // If you change SetFieldFocus(), Updated(), or TimeTextCtrlAx, make sure // you test with Jaws, Window-Eyes, and NVDA. GetAccessible()->NotifyEvent(wxACC_EVENT_OBJECT_FOCUS, this, wxOBJID_CLIENT, 0); GetAccessible()->NotifyEvent(wxACC_EVENT_OBJECT_FOCUS, this, wxOBJID_CLIENT, mFocusedDigit + 1); #endif }
void ASlider::OnSlider(wxCommandEvent &event) { if ( event.GetId() == mLWSlider->GetId() ) { #if wxUSE_ACCESSIBILITY GetAccessible()->NotifyEvent( wxACC_EVENT_OBJECT_VALUECHANGE, this, wxOBJID_CLIENT, wxACC_SELF ); #endif } event.Skip(); }
NS_IMETHODIMP nsAccessibleTreeWalker::GetParent() { nsCOMPtr<nsIDOMNode> parent; while (NS_SUCCEEDED(GetFullTreeParentNode(mState.domNode, getter_AddRefs(parent)))) { if (NS_FAILED(PopState())) { mState.domNode = parent; GetAccessible(); } if (mState.accessible) return NS_OK; } return NS_ERROR_FAILURE; }
NS_IMETHODIMP nsAccEvent::GetAccessibleDocument(nsIAccessibleDocument **aDocAccessible) { NS_ENSURE_ARG_POINTER(aDocAccessible); *aDocAccessible = nsnull; if (!mDocAccessible) { if (!mAccessible) { nsCOMPtr<nsIAccessible> accessible; GetAccessible(getter_AddRefs(accessible)); } nsCOMPtr<nsIAccessNode> accessNode(do_QueryInterface(mAccessible)); NS_ENSURE_TRUE(accessNode, NS_ERROR_FAILURE); accessNode->GetAccessibleDocument(getter_AddRefs(mDocAccessible)); } NS_IF_ADDREF(*aDocAccessible = mDocAccessible); return NS_OK; }
bool DocAccessibleParent::RecvShowEvent(const ShowEventData& aData) { if (mShutdown) return true; MOZ_DIAGNOSTIC_ASSERT(CheckDocTree()); if (aData.NewTree().IsEmpty()) { NS_ERROR("no children being added"); return false; } ProxyAccessible* parent = GetAccessible(aData.ID()); // XXX This should really never happen, but sometimes we fail to fire the // required show events. if (!parent) { NS_ERROR("adding child to unknown accessible"); return true; } uint32_t newChildIdx = aData.Idx(); if (newChildIdx > parent->ChildrenCount()) { NS_ERROR("invalid index to add child at"); return true; } DebugOnly<uint32_t> consumed = AddSubtree(parent, aData.NewTree(), 0, newChildIdx); MOZ_ASSERT(consumed == aData.NewTree().Length()); #ifdef DEBUG for (uint32_t i = 0; i < consumed; i++) { uint64_t id = aData.NewTree()[i].ID(); MOZ_ASSERT(mAccessibles.GetEntry(id)); } #endif MOZ_DIAGNOSTIC_ASSERT(CheckDocTree()); return true; }
NS_IMETHODIMP nsAccessibleTreeWalker::GetFirstChild() { mState.accessible = nsnull; if (mState.isHidden || !mState.domNode) { return NS_ERROR_FAILURE; } nsCOMPtr<nsIDOMNode> parent(mState.domNode); GetKids(parent); // Side effects change our state (mState) // Recursive loop: depth first search for first accessible child while (mState.domNode) { if ((mState.domNode != parent && GetAccessible()) || NS_SUCCEEDED(GetFirstChild())) return NS_OK; UpdateFrame(PR_FALSE); GetNextDOMNode(); } PopState(); // Return to previous state return NS_ERROR_FAILURE; }
mozilla::ipc::IPCResult DocAccessibleParent::RecvCaretMoveEvent(const uint64_t& aID, #if defined(XP_WIN) const LayoutDeviceIntRect& aCaretRect, #endif // defined (XP_WIN) const int32_t& aOffset) { if (mShutdown) { return IPC_OK(); } ProxyAccessible* proxy = GetAccessible(aID); if (!proxy) { NS_ERROR("unknown caret move event target!"); return IPC_OK(); } #if defined(XP_WIN) ProxyCaretMoveEvent(proxy, aCaretRect); #else ProxyCaretMoveEvent(proxy, aOffset); #endif if (!nsCoreUtils::AccEventObserversExist()) { return IPC_OK(); } xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(proxy); xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this); nsIDOMNode* node = nullptr; bool fromUser = true; // XXX fix me uint32_t type = nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED; RefPtr<xpcAccCaretMoveEvent> event = new xpcAccCaretMoveEvent(type, xpcAcc, doc, node, fromUser, aOffset); nsCoreUtils::DispatchAccEvent(Move(event)); return IPC_OK(); }
bool DocAccessibleParent::RecvShowEvent(const ShowEventData& aData, const bool& aFromUser) { if (mShutdown) return true; MOZ_DIAGNOSTIC_ASSERT(CheckDocTree()); if (aData.NewTree().IsEmpty()) { NS_ERROR("no children being added"); return false; } ProxyAccessible* parent = GetAccessible(aData.ID()); // XXX This should really never happen, but sometimes we fail to fire the // required show events. if (!parent) { NS_ERROR("adding child to unknown accessible"); return true; } uint32_t newChildIdx = aData.Idx(); if (newChildIdx > parent->ChildrenCount()) { NS_ERROR("invalid index to add child at"); return true; } uint32_t consumed = AddSubtree(parent, aData.NewTree(), 0, newChildIdx); MOZ_ASSERT(consumed == aData.NewTree().Length()); // XXX This shouldn't happen, but if we failed to add children then the below // is pointless and can crash. if (!consumed) { return true; } #ifdef DEBUG for (uint32_t i = 0; i < consumed; i++) { uint64_t id = aData.NewTree()[i].ID(); MOZ_ASSERT(mAccessibles.GetEntry(id)); } #endif MOZ_DIAGNOSTIC_ASSERT(CheckDocTree()); ProxyAccessible* target = parent->ChildAt(newChildIdx); ProxyShowHideEvent(target, parent, true, aFromUser); if (!nsCoreUtils::AccEventObserversExist()) { return true; } uint32_t type = nsIAccessibleEvent::EVENT_SHOW; xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(target); xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this); nsIDOMNode* node = nullptr; RefPtr<xpcAccEvent> event = new xpcAccEvent(type, xpcAcc, doc, node, aFromUser); nsCoreUtils::DispatchAccEvent(Move(event)); return true; }