Commit dbdf0188 authored by Eitan Isaacson's avatar Eitan Isaacson
Browse files

Bug 1832353 - P3: Make editable text methods async and return void. r=Jamie,ipc-reviewers,mccr8

Depends on D178715

Differential Revision: https://phabricator.services.mozilla.com/D178724
parent 832b5bfb
Loading
Loading
Loading
Loading
+32 −52
Original line number Diff line number Diff line
@@ -17,92 +17,72 @@ using namespace mozilla::a11y;

extern "C" {
static void setTextContentsCB(AtkEditableText* aText, const gchar* aString) {
  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
  if (accWrap) {
    HyperTextAccessible* text = accWrap->AsHyperText();
    if (!text || !text->IsTextRole()) {
  if (Accessible* acc = GetInternalObj(ATK_OBJECT(aText))) {
    if (acc->IsTextRole()) {
      return;
    }

    if (HyperTextAccessibleBase* text = acc->AsHyperTextBase()) {
      NS_ConvertUTF8toUTF16 strContent(aString);
      text->ReplaceText(strContent);
  } else if (RemoteAccessible* proxy = GetProxy(ATK_OBJECT(aText))) {
    NS_ConvertUTF8toUTF16 strContent(aString);
    proxy->ReplaceText(strContent);
    }
  }
}

static void insertTextCB(AtkEditableText* aText, const gchar* aString,
                         gint aLength, gint* aPosition) {
  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
  if (accWrap) {
    HyperTextAccessible* text = accWrap->AsHyperText();
    if (!text || !text->IsTextRole()) {
  if (Accessible* acc = GetInternalObj(ATK_OBJECT(aText))) {
    if (acc->IsTextRole()) {
      return;
    }

    if (HyperTextAccessibleBase* text = acc->AsHyperTextBase()) {
      NS_ConvertUTF8toUTF16 strContent(aString);
      text->InsertText(strContent, *aPosition);
  } else if (RemoteAccessible* proxy = GetProxy(ATK_OBJECT(aText))) {
    NS_ConvertUTF8toUTF16 strContent(aString);
    proxy->InsertText(strContent, *aPosition);
    }
  }
}

static void copyTextCB(AtkEditableText* aText, gint aStartPos, gint aEndPos) {
  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
  if (accWrap) {
    HyperTextAccessible* text = accWrap->AsHyperText();
    if (!text || !text->IsTextRole()) {
  if (Accessible* acc = GetInternalObj(ATK_OBJECT(aText))) {
    if (acc->IsTextRole()) {
      return;
    }

    if (HyperTextAccessibleBase* text = acc->AsHyperTextBase()) {
      text->CopyText(aStartPos, aEndPos);
  } else if (RemoteAccessible* proxy = GetProxy(ATK_OBJECT(aText))) {
    proxy->CopyText(aStartPos, aEndPos);
    }
  }
}

static void cutTextCB(AtkEditableText* aText, gint aStartPos, gint aEndPos) {
  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
  if (accWrap) {
    HyperTextAccessible* text = accWrap->AsHyperText();
    if (!text || !text->IsTextRole()) {
  if (Accessible* acc = GetInternalObj(ATK_OBJECT(aText))) {
    if (acc->IsTextRole()) {
      return;
    }

    if (HyperTextAccessibleBase* text = acc->AsHyperTextBase()) {
      text->CutText(aStartPos, aEndPos);
  } else if (RemoteAccessible* proxy = GetProxy(ATK_OBJECT(aText))) {
    proxy->CutText(aStartPos, aEndPos);
    }
  }
}

static void deleteTextCB(AtkEditableText* aText, gint aStartPos, gint aEndPos) {
  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
  if (accWrap) {
    HyperTextAccessible* text = accWrap->AsHyperText();
    if (!text || !text->IsTextRole()) {
  if (Accessible* acc = GetInternalObj(ATK_OBJECT(aText))) {
    if (acc->IsTextRole()) {
      return;
    }

    if (HyperTextAccessibleBase* text = acc->AsHyperTextBase()) {
      text->DeleteText(aStartPos, aEndPos);
  } else if (RemoteAccessible* proxy = GetProxy(ATK_OBJECT(aText))) {
    proxy->DeleteText(aStartPos, aEndPos);
    }
  }
}

MOZ_CAN_RUN_SCRIPT_BOUNDARY
static void pasteTextCB(AtkEditableText* aText, gint aPosition) {
  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
  if (accWrap) {
    RefPtr<HyperTextAccessible> text = accWrap->AsHyperText();
    if (!text || !text->IsTextRole()) {
  if (Accessible* acc = GetInternalObj(ATK_OBJECT(aText))) {
    if (acc->IsTextRole()) {
      return;
    }

    if (HyperTextAccessibleBase* text = acc->AsHyperTextBase()) {
      text->PasteText(aPosition);
  } else if (RemoteAccessible* proxy = GetProxy(ATK_OBJECT(aText))) {
    proxy->PasteText(aPosition);
    }
  }
}
}
+15 −0
Original line number Diff line number Diff line
@@ -245,6 +245,21 @@ class HyperTextAccessibleBase {
                                                     int32_t aEndOffset,
                                                     uint32_t aScrollType);

  //////////////////////////////////////////////////////////////////////////////
  // EditableTextAccessible

  MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void ReplaceText(
      const nsAString& aText) = 0;
  MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void InsertText(const nsAString& aText,
                                                      int32_t aPosition) = 0;
  MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void CopyText(int32_t aStartPos,
                                                    int32_t aEndPos) = 0;
  MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void CutText(int32_t aStartPos,
                                                   int32_t aEndPos) = 0;
  MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void DeleteText(int32_t aStartPos,
                                                      int32_t aEndPos) = 0;
  MOZ_CAN_RUN_SCRIPT virtual void PasteText(int32_t aPosition) = 0;

 protected:
  virtual const Accessible* Acc() const = 0;
  Accessible* Acc() {
+0 −64
Original line number Diff line number Diff line
@@ -25,70 +25,6 @@ inline void HyperTextAccessible::SetCaretOffset(int32_t aOffset) {
  SelectionMgr()->UpdateCaretOffset(this, aOffset);
}

inline void HyperTextAccessible::ReplaceText(const nsAString& aText) {
  if (aText.Length() == 0) {
    DeleteText(0, CharacterCount());
    return;
  }

  SetSelectionRange(0, CharacterCount());

  RefPtr<EditorBase> editorBase = GetEditor();
  if (!editorBase) {
    return;
  }

  DebugOnly<nsresult> rv = editorBase->InsertTextAsAction(aText);
  NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to insert the new text");
}

inline void HyperTextAccessible::InsertText(const nsAString& aText,
                                            int32_t aPosition) {
  RefPtr<EditorBase> editorBase = GetEditor();
  if (editorBase) {
    SetSelectionRange(aPosition, aPosition);
    DebugOnly<nsresult> rv = editorBase->InsertTextAsAction(aText);
    NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to insert the text");
  }
}

inline void HyperTextAccessible::CopyText(int32_t aStartPos, int32_t aEndPos) {
  RefPtr<EditorBase> editorBase = GetEditor();
  if (editorBase) {
    SetSelectionRange(aStartPos, aEndPos);
    editorBase->Copy();
  }
}

inline void HyperTextAccessible::CutText(int32_t aStartPos, int32_t aEndPos) {
  RefPtr<EditorBase> editorBase = GetEditor();
  if (editorBase) {
    SetSelectionRange(aStartPos, aEndPos);
    editorBase->Cut();
  }
}

inline void HyperTextAccessible::DeleteText(int32_t aStartPos,
                                            int32_t aEndPos) {
  RefPtr<EditorBase> editorBase = GetEditor();
  if (!editorBase) {
    return;
  }
  SetSelectionRange(aStartPos, aEndPos);
  DebugOnly<nsresult> rv =
      editorBase->DeleteSelectionAsAction(nsIEditor::eNone, nsIEditor::eStrip);
  NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to delete text");
}

inline void HyperTextAccessible::PasteText(int32_t aPosition) {
  RefPtr<EditorBase> editorBase = GetEditor();
  if (editorBase) {
    SetSelectionRange(aPosition, aPosition);
    editorBase->PasteAsAction(nsIClipboard::kGlobalClipboard,
                              EditorBase::DispatchPasteEvent::Yes);
  }
}

inline bool HyperTextAccessible::IsCaretAtEndOfLine() const {
  RefPtr<nsFrameSelection> frameSelection = FrameSelection();
  return frameSelection && frameSelection->GetHint() == CARET_ASSOCIATE_BEFORE;
+63 −0
Original line number Diff line number Diff line
@@ -997,6 +997,69 @@ void HyperTextAccessible::RangeAtPoint(int32_t aX, int32_t aY,
  }
}

void HyperTextAccessible::ReplaceText(const nsAString& aText) {
  if (aText.Length() == 0) {
    DeleteText(0, CharacterCount());
    return;
  }

  SetSelectionRange(0, CharacterCount());

  RefPtr<EditorBase> editorBase = GetEditor();
  if (!editorBase) {
    return;
  }

  DebugOnly<nsresult> rv = editorBase->InsertTextAsAction(aText);
  NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to insert the new text");
}

void HyperTextAccessible::InsertText(const nsAString& aText,
                                     int32_t aPosition) {
  RefPtr<EditorBase> editorBase = GetEditor();
  if (editorBase) {
    SetSelectionRange(aPosition, aPosition);
    DebugOnly<nsresult> rv = editorBase->InsertTextAsAction(aText);
    NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to insert the text");
  }
}

void HyperTextAccessible::CopyText(int32_t aStartPos, int32_t aEndPos) {
  RefPtr<EditorBase> editorBase = GetEditor();
  if (editorBase) {
    SetSelectionRange(aStartPos, aEndPos);
    editorBase->Copy();
  }
}

void HyperTextAccessible::CutText(int32_t aStartPos, int32_t aEndPos) {
  RefPtr<EditorBase> editorBase = GetEditor();
  if (editorBase) {
    SetSelectionRange(aStartPos, aEndPos);
    editorBase->Cut();
  }
}

void HyperTextAccessible::DeleteText(int32_t aStartPos, int32_t aEndPos) {
  RefPtr<EditorBase> editorBase = GetEditor();
  if (!editorBase) {
    return;
  }
  SetSelectionRange(aStartPos, aEndPos);
  DebugOnly<nsresult> rv =
      editorBase->DeleteSelectionAsAction(nsIEditor::eNone, nsIEditor::eStrip);
  NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to delete text");
}

void HyperTextAccessible::PasteText(int32_t aPosition) {
  RefPtr<EditorBase> editorBase = GetEditor();
  if (editorBase) {
    SetSelectionRange(aPosition, aPosition);
    editorBase->PasteAsAction(nsIClipboard::kGlobalClipboard,
                              EditorBase::DispatchPasteEvent::Yes);
  }
}

////////////////////////////////////////////////////////////////////////////////
// LocalAccessible public

+11 −9
Original line number Diff line number Diff line
@@ -200,15 +200,17 @@ class HyperTextAccessible : public AccessibleWrap,
  //////////////////////////////////////////////////////////////////////////////
  // EditableTextAccessible

  MOZ_CAN_RUN_SCRIPT_BOUNDARY void ReplaceText(const nsAString& aText);
  MOZ_CAN_RUN_SCRIPT_BOUNDARY void InsertText(const nsAString& aText,
                                              int32_t aPosition);
  MOZ_CAN_RUN_SCRIPT_BOUNDARY void CopyText(int32_t aStartPos, int32_t aEndPos);
  MOZ_CAN_RUN_SCRIPT_BOUNDARY void CutText(int32_t aStartPos, int32_t aEndPos);
  MOZ_CAN_RUN_SCRIPT_BOUNDARY void DeleteText(int32_t aStartPos,
                                              int32_t aEndPos);
  MOZ_CAN_RUN_SCRIPT
  void PasteText(int32_t aPosition);
  MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void ReplaceText(
      const nsAString& aText) override;
  MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void InsertText(
      const nsAString& aText, int32_t aPosition) override;
  MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void CopyText(int32_t aStartPos,
                                                    int32_t aEndPos) override;
  MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void CutText(int32_t aStartPos,
                                                   int32_t aEndPos) override;
  MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual void DeleteText(int32_t aStartPos,
                                                      int32_t aEndPos) override;
  MOZ_CAN_RUN_SCRIPT virtual void PasteText(int32_t aPosition) override;

  /**
   * Return the editor associated with the accessible.
Loading