コード例 #1
0
ファイル: Platform.cpp プロジェクト: escapewindow/gecko-dev
void
a11y::ProxyCaretMoveEvent(ProxyAccessible* aTarget, int32_t aOffset)
{
  SessionAccessibility* sessionAcc =
    SessionAccessibility::GetInstanceFor(aTarget);

  if (sessionAcc) {
    sessionAcc->SendTextSelectionChangedEvent(WrapperFor(aTarget), aOffset);
  }
}
コード例 #2
0
ファイル: Platform.cpp プロジェクト: escapewindow/gecko-dev
void
a11y::ProxyShowHideEvent(ProxyAccessible* aTarget,
                         ProxyAccessible* aParent,
                         bool aInsert,
                         bool aFromUser)
{
  SessionAccessibility* sessionAcc =
    SessionAccessibility::GetInstanceFor(aTarget);
  if (sessionAcc) {
    sessionAcc->SendWindowContentChangedEvent(WrapperFor(aParent));
  }
}
コード例 #3
0
ファイル: Platform.cpp プロジェクト: escapewindow/gecko-dev
void
a11y::ProxyEvent(ProxyAccessible* aTarget, uint32_t aEventType)
{
  SessionAccessibility* sessionAcc =
    SessionAccessibility::GetInstanceFor(aTarget);
  if (!sessionAcc) {
    return;
  }

  switch (aEventType) {
    case nsIAccessibleEvent::EVENT_FOCUS:
      sessionAcc->SendFocusEvent(WrapperFor(aTarget));
      break;
  }
}
コード例 #4
0
ファイル: Platform.cpp プロジェクト: escapewindow/gecko-dev
void
a11y::ProxyTextChangeEvent(ProxyAccessible* aTarget,
                           const nsString& aStr,
                           int32_t aStart,
                           uint32_t aLen,
                           bool aIsInsert,
                           bool aFromUser)
{
  SessionAccessibility* sessionAcc =
    SessionAccessibility::GetInstanceFor(aTarget);

  if (sessionAcc) {
    sessionAcc->SendTextChangedEvent(
      WrapperFor(aTarget), aStr, aStart, aLen, aIsInsert, aFromUser);
  }
}
コード例 #5
0
ファイル: Platform.cpp プロジェクト: escapewindow/gecko-dev
void
a11y::ProxyScrollingEvent(ProxyAccessible* aTarget,
                          uint32_t aEventType,
                          uint32_t aScrollX,
                          uint32_t aScrollY,
                          uint32_t aMaxScrollX,
                          uint32_t aMaxScrollY)
{
  if (aEventType == nsIAccessibleEvent::EVENT_SCROLLING) {
    SessionAccessibility* sessionAcc =
      SessionAccessibility::GetInstanceFor(aTarget);

    if (sessionAcc) {
      sessionAcc->SendScrollingEvent(
        WrapperFor(aTarget), aScrollX, aScrollY, aMaxScrollX, aMaxScrollY);
    }
  }
}
コード例 #6
0
ファイル: Platform.cpp プロジェクト: escapewindow/gecko-dev
void
a11y::ProxyStateChangeEvent(ProxyAccessible* aTarget,
                            uint64_t aState,
                            bool aEnabled)
{
  SessionAccessibility* sessionAcc =
    SessionAccessibility::GetInstanceFor(aTarget);

  if (!sessionAcc) {
    return;
  }

  if (aState & states::CHECKED) {
    sessionAcc->SendClickedEvent(WrapperFor(aTarget));
  }

  if (aState & states::SELECTED) {
    sessionAcc->SendSelectedEvent(WrapperFor(aTarget));
  }

  if (aState & states::BUSY) {
    sessionAcc->SendWindowStateChangedEvent(WrapperFor(aTarget));
  }
}
コード例 #7
0
ファイル: Platform.cpp プロジェクト: escapewindow/gecko-dev
void
a11y::ProxyVirtualCursorChangeEvent(ProxyAccessible* aTarget,
                                    ProxyAccessible* aOldPosition,
                                    int32_t aOldStartOffset,
                                    int32_t aOldEndOffset,
                                    ProxyAccessible* aNewPosition,
                                    int32_t aNewStartOffset,
                                    int32_t aNewEndOffset,
                                    int16_t aReason,
                                    int16_t aBoundaryType,
                                    bool aFromUser)
{
  if (!aNewPosition) {
    return;
  }

  SessionAccessibility* sessionAcc =
    SessionAccessibility::GetInstanceFor(aTarget);

  if (!sessionAcc) {
    return;
  }

  if (aOldPosition != aNewPosition) {
    if (aReason == nsIAccessiblePivot::REASON_POINT) {
      sessionAcc->SendHoverEnterEvent(WrapperFor(aNewPosition));
    } else {
      sessionAcc->SendAccessibilityFocusedEvent(WrapperFor(aNewPosition));
    }
  }

  if (aBoundaryType != nsIAccessiblePivot::NO_BOUNDARY) {
    sessionAcc->SendTextTraversedEvent(
      WrapperFor(aNewPosition), aNewStartOffset, aNewEndOffset);
  }
}
コード例 #8
0
ファイル: AccessibleWrap.cpp プロジェクト: djg/gecko-dev
nsresult AccessibleWrap::HandleAccEvent(AccEvent* aEvent) {
  auto accessible = static_cast<AccessibleWrap*>(aEvent->GetAccessible());
  NS_ENSURE_TRUE(accessible, NS_ERROR_FAILURE);
  DocAccessibleWrap* doc =
      static_cast<DocAccessibleWrap*>(accessible->Document());
  if (doc) {
    switch (aEvent->GetEventType()) {
      case nsIAccessibleEvent::EVENT_FOCUS: {
        if (DocAccessibleWrap* topContentDoc =
                doc->GetTopLevelContentDoc(accessible)) {
          topContentDoc->CacheFocusPath(accessible);
        }
        break;
      }
      case nsIAccessibleEvent::EVENT_VIRTUALCURSOR_CHANGED: {
        AccVCChangeEvent* vcEvent = downcast_accEvent(aEvent);
        auto newPosition =
            static_cast<AccessibleWrap*>(vcEvent->NewAccessible());
        if (newPosition) {
          if (DocAccessibleWrap* topContentDoc =
                  doc->GetTopLevelContentDoc(accessible)) {
            topContentDoc->CacheFocusPath(newPosition);
          }
        }
        break;
      }
    }
  }

  nsresult rv = Accessible::HandleAccEvent(aEvent);
  NS_ENSURE_SUCCESS(rv, rv);

  if (IPCAccessibilityActive()) {
    return NS_OK;
  }

  // The accessible can become defunct if we have an xpcom event listener
  // which decides it would be fun to change the DOM and flush layout.
  if (accessible->IsDefunct() || !accessible->IsBoundToParent()) {
    return NS_OK;
  }

  if (doc) {
    if (!nsCoreUtils::IsContentDocument(doc->DocumentNode())) {
      return NS_OK;
    }
  }

  SessionAccessibility* sessionAcc =
      SessionAccessibility::GetInstanceFor(accessible);
  if (!sessionAcc) {
    return NS_OK;
  }

  switch (aEvent->GetEventType()) {
    case nsIAccessibleEvent::EVENT_FOCUS:
      sessionAcc->SendFocusEvent(accessible);
      break;
    case nsIAccessibleEvent::EVENT_VIRTUALCURSOR_CHANGED: {
      AccVCChangeEvent* vcEvent = downcast_accEvent(aEvent);
      auto newPosition = static_cast<AccessibleWrap*>(vcEvent->NewAccessible());
      auto oldPosition = static_cast<AccessibleWrap*>(vcEvent->OldAccessible());

      if (sessionAcc && newPosition) {
        if (oldPosition != newPosition) {
          if (vcEvent->Reason() == nsIAccessiblePivot::REASON_POINT) {
            sessionAcc->SendHoverEnterEvent(newPosition);
          } else {
            sessionAcc->SendAccessibilityFocusedEvent(newPosition);
          }
        }

        if (vcEvent->BoundaryType() != nsIAccessiblePivot::NO_BOUNDARY) {
          sessionAcc->SendTextTraversedEvent(
              newPosition, vcEvent->NewStartOffset(), vcEvent->NewEndOffset());
        }
      }
      break;
    }
    case nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED: {
      AccCaretMoveEvent* event = downcast_accEvent(aEvent);
      sessionAcc->SendTextSelectionChangedEvent(accessible,
                                                event->GetCaretOffset());
      break;
    }
    case nsIAccessibleEvent::EVENT_TEXT_INSERTED:
    case nsIAccessibleEvent::EVENT_TEXT_REMOVED: {
      AccTextChangeEvent* event = downcast_accEvent(aEvent);
      sessionAcc->SendTextChangedEvent(
          accessible, event->ModifiedText(), event->GetStartOffset(),
          event->GetLength(), event->IsTextInserted(),
          event->IsFromUserInput());
      break;
    }
    case nsIAccessibleEvent::EVENT_STATE_CHANGE: {
      AccStateChangeEvent* event = downcast_accEvent(aEvent);
      auto state = event->GetState();
      if (state & states::CHECKED) {
        sessionAcc->SendClickedEvent(accessible, event->IsStateEnabled());
      }

      if (state & states::SELECTED) {
        sessionAcc->SendSelectedEvent(accessible, event->IsStateEnabled());
      }

      if (state & states::BUSY) {
        sessionAcc->SendWindowStateChangedEvent(accessible);
      }
      break;
    }
    case nsIAccessibleEvent::EVENT_SCROLLING: {
      AccScrollingEvent* event = downcast_accEvent(aEvent);
      sessionAcc->SendScrollingEvent(accessible, event->ScrollX(),
                                     event->ScrollY(), event->MaxScrollX(),
                                     event->MaxScrollY());
      break;
    }
    case nsIAccessibleEvent::EVENT_SHOW:
    case nsIAccessibleEvent::EVENT_HIDE: {
      AccMutationEvent* event = downcast_accEvent(aEvent);
      auto parent = static_cast<AccessibleWrap*>(event->Parent());
      sessionAcc->SendWindowContentChangedEvent(parent);
      break;
    }
    default:
      break;
  }

  return NS_OK;
}