Bug 1572685 - part 10: Get rid of HTMLEditRules::mUtilRange r=m_kato

`HTMLEditRules::mUtilRange` is used only for the argument of
`HTMLEditRules::UpdateDocChangeRange()`.  However, it does not need to be
a range instance since it compares its start and
`TopLevelEditSubAction::mChangedRange->StartRef()`, and its end and
`TopLevelEditSubAction::mChangedRange->EndRef()`.  Therefore, with rewriting
it as taking 2 `EditorRawDOMPoint`s, we don't need `mUtilRange`.

Differential Revision: https://phabricator.services.mozilla.com/D42105

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Masayuki Nakano 2019-08-20 01:52:23 +00:00
parent 0cc09df825
commit f3a6c9590b
7 changed files with 138 additions and 164 deletions

View File

@ -5375,4 +5375,85 @@ void EditorBase::AutoEditActionDataSetter::InitializeDataTransferWithClipboard(
true /* is external */, aClipboardType);
}
/*****************************************************************************
* mozilla::EditorBase::TopLevelEditSubActionData
*****************************************************************************/
nsresult EditorBase::TopLevelEditSubActionData::AddNodeToChangedRange(
const HTMLEditor& aHTMLEditor, nsINode& aNode) {
EditorRawDOMPoint startPoint(&aNode);
EditorRawDOMPoint endPoint(&aNode);
DebugOnly<bool> advanced = endPoint.AdvanceOffset();
NS_WARNING_ASSERTION(advanced, "Failed to set endPoint to next to aNode");
return AddRangeToChangedRange(aHTMLEditor, startPoint, endPoint);
}
nsresult EditorBase::TopLevelEditSubActionData::AddPointToChangedRange(
const HTMLEditor& aHTMLEditor, const EditorRawDOMPoint& aPoint) {
return AddRangeToChangedRange(aHTMLEditor, aPoint, aPoint);
}
nsresult EditorBase::TopLevelEditSubActionData::AddRangeToChangedRange(
const HTMLEditor& aHTMLEditor, const EditorRawDOMPoint& aStart,
const EditorRawDOMPoint& aEnd) {
if (NS_WARN_IF(!aStart.IsSet()) || NS_WARN_IF(!aEnd.IsSet())) {
return NS_ERROR_INVALID_ARG;
}
if (!aHTMLEditor.IsDescendantOfRoot(aStart.GetContainer()) ||
(aStart.GetContainer() != aEnd.GetContainer() &&
!aHTMLEditor.IsDescendantOfRoot(aEnd.GetContainer()))) {
return NS_OK;
}
// If mChangedRange hasn't been set, we can just set it to `aStart` and
// `aEnd`.
if (!mChangedRange->IsPositioned()) {
nsresult rv = mChangedRange->SetStartAndEnd(aStart.ToRawRangeBoundary(),
aEnd.ToRawRangeBoundary());
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
"Failed to set mChangedRange to given range");
return rv;
}
bool disconnected = false;
int16_t relation = mChangedRange->StartRef().IsSet()
? nsContentUtils::ComparePoints(
mChangedRange->StartRef(),
aStart.ToRawRangeBoundary(), &disconnected)
: 1;
if (NS_WARN_IF(disconnected)) {
return NS_ERROR_FAILURE;
}
// If aStart is before start of mChangedRange, reset the start.
if (relation > 0) {
ErrorResult error;
mChangedRange->SetStart(aStart.ToRawRangeBoundary(), error);
if (NS_WARN_IF(error.Failed())) {
return error.StealNSResult();
}
}
relation = mChangedRange->EndRef().IsSet()
? nsContentUtils::ComparePoints(mChangedRange->EndRef(),
aEnd.ToRawRangeBoundary(),
&disconnected)
: 1;
if (NS_WARN_IF(disconnected)) {
return NS_ERROR_FAILURE;
}
// If aEnd is after end of mChangedRange, reset the end.
if (relation < 0) {
ErrorResult error;
mChangedRange->SetEnd(aEnd.ToRawRangeBoundary(), error);
if (NS_WARN_IF(error.Failed())) {
return error.StealNSResult();
}
}
return NS_OK;
}
} // namespace mozilla

View File

@ -655,6 +655,25 @@ class EditorBase : public nsIEditor,
// to restore it.
bool mRestoreContentEditableCount;
/**
* Extend mChangedRange to include `aNode`.
*/
nsresult AddNodeToChangedRange(const HTMLEditor& aHTMLEditor,
nsINode& aNode);
/**
* Extend mChangedRange to include `aPoint`.
*/
nsresult AddPointToChangedRange(const HTMLEditor& aHTMLEditor,
const EditorRawDOMPoint& aPoint);
/**
* Extend mChangedRange to include `aStart` and `aEnd`.
*/
nsresult AddRangeToChangedRange(const HTMLEditor& aHTMLEditor,
const EditorRawDOMPoint& aStart,
const EditorRawDOMPoint& aEnd);
private:
void Clear() {
mDidExplicitlySetInterLine = false;

View File

@ -200,7 +200,6 @@ HTMLEditRules::HTMLEditRules()
void HTMLEditRules::InitFields() {
mHTMLEditor = nullptr;
mReturnInEmptyLIKillsList = true;
mUtilRange = nullptr;
mJoinOffset = 0;
}
@ -243,8 +242,6 @@ nsresult HTMLEditRules::Init(TextEditor* aTextEditor) {
}
// make a utility range for use by the listenter
mUtilRange = new nsRange(HTMLEditorRef().GetDocument());
if (rootElement) {
nsresult rv = InsertBRElementToEmptyListItemsAndTableCellsInRange(
RawRangeBoundary(rootElement, 0),
@ -313,12 +310,6 @@ nsresult HTMLEditRules::BeforeEdit() {
HTMLEditorRef().RangeUpdaterRef().RegisterRangeItem(
HTMLEditorRef().TopLevelEditSubActionDataRef().mSelectedRange);
// Clear out mUtilRange
if (mUtilRange) {
// Ditto for mUtilRange.
mUtilRange->Reset();
}
// Remember current inline styles for deletion and normal insertion ops
bool cacheInlineStyles;
switch (HTMLEditorRef().GetTopLevelEditSubAction()) {
@ -10141,77 +10132,6 @@ nsresult HTMLEditRules::ConfirmSelectionInBody() {
return NS_OK;
}
nsresult HTMLEditRules::UpdateDocChangeRange(nsRange* aRange) {
MOZ_ASSERT(IsEditorDataAvailable());
// first make sure aRange is in the document. It might not be if
// portions of our editting action involved manipulating nodes
// prior to placing them in the document (e.g., populating a list item
// before placing it in its list)
const RangeBoundary& atStart = aRange->StartRef();
if (NS_WARN_IF(!atStart.IsSet())) {
return NS_ERROR_FAILURE;
}
if (!HTMLEditorRef().IsDescendantOfRoot(atStart.Container())) {
// Just return - we don't need to adjust
// TopLevelEditSubActionData::mChangedRange in this case
return NS_OK;
}
// compare starts of ranges
ErrorResult error;
int16_t result = HTMLEditorRef()
.TopLevelEditSubActionDataRef()
.mChangedRange->CompareBoundaryPoints(
Range_Binding::START_TO_START, *aRange, error);
if (error.ErrorCodeIs(NS_ERROR_NOT_INITIALIZED)) {
// This will happen is TopLevelEditSubActionData::mChangedRange is non-null,
// but the range is uninitialized. In this case we'll set the start to
// aRange start. The same test won't be needed further down since after
// we've set the start the range will be collapsed to that point.
result = 1;
error.SuppressException();
}
if (NS_WARN_IF(error.Failed())) {
return error.StealNSResult();
}
// Positive result means TopLevelEditSubActionData::mChangedRange start is
// after aRange start.
if (result > 0) {
HTMLEditorRef().TopLevelEditSubActionDataRef().mChangedRange->SetStart(
atStart.AsRaw(), error);
if (NS_WARN_IF(error.Failed())) {
return error.StealNSResult();
}
}
// compare ends of ranges
result = HTMLEditorRef()
.TopLevelEditSubActionDataRef()
.mChangedRange->CompareBoundaryPoints(Range_Binding::END_TO_END,
*aRange, error);
if (NS_WARN_IF(error.Failed())) {
return error.StealNSResult();
}
// Negative result means TopLevelEditSubActionData::mChangedRange end is
// before aRange end.
if (result < 0) {
const RangeBoundary& atEnd = aRange->EndRef();
if (NS_WARN_IF(!atEnd.IsSet())) {
return NS_ERROR_FAILURE;
}
HTMLEditorRef().TopLevelEditSubActionDataRef().mChangedRange->SetEnd(
atEnd.AsRaw(), error);
if (NS_WARN_IF(error.Failed())) {
return error.StealNSResult();
}
}
return NS_OK;
}
nsresult HTMLEditRules::InsertBRIfNeededInternal(nsINode& aNode,
bool aForPadding) {
MOZ_ASSERT(IsEditorDataAvailable());
@ -10260,13 +10180,10 @@ void HTMLEditRules::DidCreateNode(Element& aNewElement) {
AutoSafeEditorData setData(*this, *mHTMLEditor);
// assumption that Join keeps the righthand node
IgnoredErrorResult ignoredError;
mUtilRange->SelectNode(aNewElement, ignoredError);
if (NS_WARN_IF(ignoredError.Failed())) {
return;
}
UpdateDocChangeRange(mUtilRange);
DebugOnly<nsresult> rv =
HTMLEditorRef().TopLevelEditSubActionDataRef().AddNodeToChangedRange(
HTMLEditorRef(), aNewElement);
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "AddNodeToChangedRange() failed");
}
void HTMLEditRules::DidInsertNode(nsIContent& aContent) {
@ -10280,12 +10197,10 @@ void HTMLEditRules::DidInsertNode(nsIContent& aContent) {
AutoSafeEditorData setData(*this, *mHTMLEditor);
IgnoredErrorResult ignoredError;
mUtilRange->SelectNode(aContent, ignoredError);
if (NS_WARN_IF(ignoredError.Failed())) {
return;
}
UpdateDocChangeRange(mUtilRange);
DebugOnly<nsresult> rv =
HTMLEditorRef().TopLevelEditSubActionDataRef().AddNodeToChangedRange(
HTMLEditorRef(), aContent);
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "AddNodeToChangedRange() failed");
}
void HTMLEditRules::WillDeleteNode(nsINode& aChild) {
@ -10299,12 +10214,10 @@ void HTMLEditRules::WillDeleteNode(nsINode& aChild) {
AutoSafeEditorData setData(*this, *mHTMLEditor);
IgnoredErrorResult ignoredError;
mUtilRange->SelectNode(aChild, ignoredError);
if (NS_WARN_IF(ignoredError.Failed())) {
return;
}
UpdateDocChangeRange(mUtilRange);
DebugOnly<nsresult> rv =
HTMLEditorRef().TopLevelEditSubActionDataRef().AddNodeToChangedRange(
HTMLEditorRef(), aChild);
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "AddNodeToChangedRange() failed");
}
void HTMLEditRules::DidSplitNode(nsINode& aExistingRightNode,
@ -10319,12 +10232,11 @@ void HTMLEditRules::DidSplitNode(nsINode& aExistingRightNode,
AutoSafeEditorData setData(*this, *mHTMLEditor);
nsresult rv =
mUtilRange->SetStartAndEnd(&aNewLeftNode, 0, &aExistingRightNode, 0);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
UpdateDocChangeRange(mUtilRange);
DebugOnly<nsresult> rv =
HTMLEditorRef().TopLevelEditSubActionDataRef().AddRangeToChangedRange(
HTMLEditorRef(), EditorRawDOMPoint(&aNewLeftNode, 0),
EditorRawDOMPoint(&aExistingRightNode, 0));
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "AddRangeToChangedRange() failed");
}
void HTMLEditRules::WillJoinNodes(nsINode& aLeftNode, nsINode& aRightNode) {
@ -10351,12 +10263,10 @@ void HTMLEditRules::DidJoinNodes(nsINode& aLeftNode, nsINode& aRightNode) {
AutoSafeEditorData setData(*this, *mHTMLEditor);
// assumption that Join keeps the righthand node
nsresult rv = mUtilRange->CollapseTo(&aRightNode, mJoinOffset);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
UpdateDocChangeRange(mUtilRange);
DebugOnly<nsresult> rv =
HTMLEditorRef().TopLevelEditSubActionDataRef().AddPointToChangedRange(
HTMLEditorRef(), EditorRawDOMPoint(&aRightNode, mJoinOffset));
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "AddPointToChangedRange() failed");
}
void HTMLEditRules::DidInsertText(nsINode& aTextNode, int32_t aOffset,
@ -10371,13 +10281,11 @@ void HTMLEditRules::DidInsertText(nsINode& aTextNode, int32_t aOffset,
AutoSafeEditorData setData(*this, *mHTMLEditor);
int32_t length = aString.Length();
nsresult rv = mUtilRange->SetStartAndEnd(&aTextNode, aOffset, &aTextNode,
aOffset + length);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
UpdateDocChangeRange(mUtilRange);
DebugOnly<nsresult> rv =
HTMLEditorRef().TopLevelEditSubActionDataRef().AddRangeToChangedRange(
HTMLEditorRef(), EditorRawDOMPoint(&aTextNode, aOffset),
EditorRawDOMPoint(&aTextNode, aOffset + aString.Length()));
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "AddRangeToChangedRange() failed");
}
void HTMLEditRules::DidDeleteText(nsINode& aTextNode, int32_t aOffset,
@ -10392,11 +10300,10 @@ void HTMLEditRules::DidDeleteText(nsINode& aTextNode, int32_t aOffset,
AutoSafeEditorData setData(*this, *mHTMLEditor);
nsresult rv = mUtilRange->CollapseTo(&aTextNode, aOffset);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
UpdateDocChangeRange(mUtilRange);
DebugOnly<nsresult> rv =
HTMLEditorRef().TopLevelEditSubActionDataRef().AddPointToChangedRange(
HTMLEditorRef(), EditorRawDOMPoint(&aTextNode, aOffset));
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "AddPointToChangedRange() failed");
}
void HTMLEditRules::WillDeleteSelection() {
@ -10410,20 +10317,13 @@ void HTMLEditRules::WillDeleteSelection() {
AutoSafeEditorData setData(*this, *mHTMLEditor);
EditorRawDOMPoint startPoint = EditorBase::GetStartPoint(*SelectionRefPtr());
if (NS_WARN_IF(!startPoint.IsSet())) {
return;
}
EditorRawDOMPoint endPoint = EditorBase::GetEndPoint(*SelectionRefPtr());
if (NS_WARN_IF(!endPoint.IsSet())) {
return;
}
nsresult rv = mUtilRange->SetStartAndEnd(startPoint.ToRawRangeBoundary(),
endPoint.ToRawRangeBoundary());
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
UpdateDocChangeRange(mUtilRange);
// XXX Looks like that this is wrong. We delete multiple selection ranges
// once, but this adds only first range into the changed range.
DebugOnly<nsresult> rv =
HTMLEditorRef().TopLevelEditSubActionDataRef().AddRangeToChangedRange(
HTMLEditorRef(), EditorBase::GetStartPoint(*SelectionRefPtr()),
EditorBase::GetStartPoint(*SelectionRefPtr()));
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "AddRangeToChangedRange() failed");
}
nsresult HTMLEditRules::RemoveAlignment(nsINode& aNode,

View File

@ -1201,7 +1201,6 @@ class HTMLEditRules : public TextEditRules {
MOZ_MUST_USE nsresult RemoveEmptyNodesInChangedRange();
nsresult SelectionEndpointInNode(nsINode* aNode, bool* aResult);
nsresult UpdateDocChangeRange(nsRange* aRange);
/**
* ConfirmSelectionInBody() makes sure that Selection is in editor root
@ -1327,11 +1326,8 @@ class HTMLEditRules : public TextEditRules {
bool mInitialized;
bool mListenerEnabled;
bool mReturnInEmptyLIKillsList;
RefPtr<nsRange> mUtilRange;
// Need to remember an int across willJoin/didJoin...
uint32_t mJoinOffset;
friend class NS_CYCLE_COLLECTION_CLASSNAME(TextEditRules);
};
} // namespace mozilla

View File

@ -60,25 +60,6 @@ using namespace dom;
* mozilla::TextEditRules
********************************************************/
NS_IMPL_CYCLE_COLLECTION_CLASS(TextEditRules)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(TextEditRules)
if (HTMLEditRules* htmlEditRules = tmp->AsHTMLEditRules()) {
HTMLEditRules* tmp = htmlEditRules;
NS_IMPL_CYCLE_COLLECTION_UNLINK(mUtilRange)
}
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(TextEditRules)
if (HTMLEditRules* htmlEditRules = tmp->AsHTMLEditRules()) {
HTMLEditRules* tmp = htmlEditRules;
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mUtilRange)
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(TextEditRules, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(TextEditRules, Release)
TextEditRules::TextEditRules()
: mTextEditor(nullptr),
mData(nullptr),

View File

@ -68,8 +68,7 @@ class TextEditRules {
template <typename T>
using OwningNonNull = OwningNonNull<T>;
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(TextEditRules)
NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(TextEditRules)
NS_INLINE_DECL_REFCOUNTING(TextEditRules)
TextEditRules();

View File

@ -109,13 +109,11 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(TextEditor, EditorBase)
if (tmp->mMaskTimer) {
tmp->mMaskTimer->Cancel();
}
NS_IMPL_CYCLE_COLLECTION_UNLINK(mRules)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mCachedDocumentEncoder)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mMaskTimer)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(TextEditor, EditorBase)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRules)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCachedDocumentEncoder)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMaskTimer)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END