gecko-dev/accessible/generic/HyperTextAccessible-inl.h
James Teh 154b408813 Bug 1905021: Don't incorrectly treat the start of a node inside a contentEditable as the end of a line. r=nlapre
Previously, we assumed that CaretAssociationHint::Before always meant the caret was at the insertion point at the end of a line.
However, it can also mean that the caret is before the start of a node in the middle of a line.
To fix this, we need to check for line and paragraph boundaries.
See the code comments for details.

I moved this functionality completely out of HyperTextAccessible and into TextLeafPoint.
First, it was easiest to do these checks with private functions already available to TextLeafPoint.
Second, this ideally belongs in TextLeafPoint anyway; its existence in HyperTextAccessible was vestigial.

Differential Revision: https://phabricator.services.mozilla.com/D215089
2024-07-01 06:24:13 +00:00

43 lines
1.3 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_a11y_HyperTextAccessible_inl_h__
#define mozilla_a11y_HyperTextAccessible_inl_h__
#include "HyperTextAccessible.h"
#include "nsAccUtils.h"
#include "nsIClipboard.h"
#include "nsFrameSelection.h"
#include "mozilla/CaretAssociationHint.h"
#include "mozilla/EditorBase.h"
namespace mozilla::a11y {
inline void HyperTextAccessible::SetCaretOffset(int32_t aOffset) {
SetSelectionRange(aOffset, aOffset);
// XXX: Force cache refresh until a good solution for AT emulation of user
// input is implemented (AccessFu caret movement).
SelectionMgr()->UpdateCaretOffset(this, aOffset);
}
inline already_AddRefed<nsFrameSelection> HyperTextAccessible::FrameSelection()
const {
nsIFrame* frame = GetFrame();
return frame ? frame->GetFrameSelection() : nullptr;
}
inline dom::Selection* HyperTextAccessible::DOMSelection() const {
RefPtr<nsFrameSelection> frameSelection = FrameSelection();
return frameSelection ? frameSelection->GetSelection(SelectionType::eNormal)
: nullptr;
}
} // namespace mozilla::a11y
#endif