summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@wolfbeast.com>2020-04-12 12:52:18 +0200
committerwolfbeast <mcwerewolf@wolfbeast.com>2020-04-14 13:27:57 +0200
commit26c888208a11c3e9159fd5c7755abb8a34aeda39 (patch)
treeaeb8d96cbe900874930a76f0366ab16873a6a008
parent9a52b3b852181bc956a97dbff1da68cf8ef415a2 (diff)
downloadUXP-26c888208a11c3e9159fd5c7755abb8a34aeda39.tar
UXP-26c888208a11c3e9159fd5c7755abb8a34aeda39.tar.gz
UXP-26c888208a11c3e9159fd5c7755abb8a34aeda39.tar.lz
UXP-26c888208a11c3e9159fd5c7755abb8a34aeda39.tar.xz
UXP-26c888208a11c3e9159fd5c7755abb8a34aeda39.zip
Issue #1512 - Improve handling of multiple selections.
IsSelectionEditable should check whether the focus node and anchor node aren't null before trying to use them. This also changes the initialization of selections' aOutIndex to the last range in the selection as a fallback in case we don't add a range later (in AddItem) which could also end up with a null selection otherwise if the additional selection nodes are removed.
-rw-r--r--editor/libeditor/HTMLEditor.cpp10
-rw-r--r--layout/generic/nsSelection.cpp2
2 files changed, 9 insertions, 3 deletions
diff --git a/editor/libeditor/HTMLEditor.cpp b/editor/libeditor/HTMLEditor.cpp
index 368f7a3e9..532da7a15 100644
--- a/editor/libeditor/HTMLEditor.cpp
+++ b/editor/libeditor/HTMLEditor.cpp
@@ -3344,12 +3344,18 @@ HTMLEditor::GetIsSelectionEditable(bool* aIsSelectionEditable)
RefPtr<Selection> selection = GetSelection();
NS_ENSURE_TRUE(selection, NS_ERROR_NULL_POINTER);
+ nsINode* anchorNode = selection->GetAnchorNode();
+ nsINode* focusNode = selection->GetFocusNode();
+ if (!anchorNode || !focusNode) {
+ return NS_ERROR_FAILURE;
+ }
+
// Per the editing spec as of June 2012: we have to have a selection whose
// start and end nodes are editable, and which share an ancestor editing
// host. (Bug 766387.)
*aIsSelectionEditable = selection->RangeCount() &&
- selection->GetAnchorNode()->IsEditable() &&
- selection->GetFocusNode()->IsEditable();
+ anchorNode->IsEditable() &&
+ focusNode->IsEditable();
if (*aIsSelectionEditable) {
nsINode* commonAncestor =
diff --git a/layout/generic/nsSelection.cpp b/layout/generic/nsSelection.cpp
index f2959dc9d..5ccb2d8bf 100644
--- a/layout/generic/nsSelection.cpp
+++ b/layout/generic/nsSelection.cpp
@@ -3844,7 +3844,7 @@ Selection::AddItem(nsRange* aItem, int32_t* aOutIndex, bool aNoStartSelect)
if (mUserInitiated) {
AutoTArray<RefPtr<nsRange>, 4> rangesToAdd;
- *aOutIndex = -1;
+ *aOutIndex = int32_t(mRanges.Length()) - 1;
nsIDocument* doc = GetParentObject();
bool selectEventsEnabled =