зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1533293 - part 4: Make Selection::SetStartAndEndInternal() select frames by itself r=smaug
When adding an range via `Selection::AddItem()` and only when it's caused by user's operation, the range may be split at non-selectable content. This is done in `nsRange::ExcludeNonSelectableNodes()` but it modifies the given range as the first range. Then, [`Selection::AddRangeInternal()` calls `Selection::SelectFrames()` with the range which may have been modified by `nsRange::ExcludeNonSelectableNodes()`](https://searchfox.org/mozilla-central/rev/358f816f63da072145c593e9e2ac36b7250ecd25/dom/base/Selection.cpp#2030,2049). Therefore, only the frames between first child of `<body>` element and previous element of first non-selectable content are painted as selection after user does "Select All". [`Selection::Extend()` calls `Selection::SelectFrames()` by itself for all existing ranges](https://searchfox.org/mozilla-central/rev/358f816f63da072145c593e9e2ac36b7250ecd25/dom/base/Selection.cpp#2718-2724). Therefore, this patch creates new method and makes both `Selection::Extend()` and `Selection::SetStartAndEndInternal()` call it only when the result is not only one range. Differential Revision: https://phabricator.services.mozilla.com/D24871 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
0a753c3aac
Коммит
05ac721436
|
@ -1509,6 +1509,14 @@ nsresult Selection::SelectAllFramesForContent(
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Selection::SelectFramesInAllRanges(nsPresContext* aPresContext) {
|
||||||
|
for (size_t i = 0; i < mRanges.Length(); ++i) {
|
||||||
|
nsRange* range = mRanges[i].mRange;
|
||||||
|
MOZ_ASSERT(range->IsInSelection());
|
||||||
|
SelectFrames(aPresContext, range, range->IsInSelection());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The idea of this helper method is to select or deselect "top to bottom",
|
* The idea of this helper method is to select or deselect "top to bottom",
|
||||||
* traversing through the frames
|
* traversing through the frames
|
||||||
|
@ -2716,11 +2724,7 @@ void Selection::Extend(nsINode& aContainer, uint32_t aOffset,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mRanges.Length() > 1) {
|
if (mRanges.Length() > 1) {
|
||||||
for (size_t i = 0; i < mRanges.Length(); ++i) {
|
SelectFramesInAllRanges(presContext);
|
||||||
nsRange* range = mRanges[i].mRange;
|
|
||||||
MOZ_ASSERT(range->IsInSelection());
|
|
||||||
SelectFrames(presContext, range, range->IsInSelection());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_OUT_RANGE(range);
|
DEBUG_OUT_RANGE(range);
|
||||||
|
@ -3487,6 +3491,16 @@ void Selection::SetStartAndEndInternal(InLimiter aInLimiter,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Adding a range may set 2 or more ranges if there are non-selectable
|
||||||
|
// contents only when this change is caused by a user operation. Therefore,
|
||||||
|
// we need to select frames with the result in such case.
|
||||||
|
if (mUserInitiated) {
|
||||||
|
RefPtr<nsPresContext> presContext = GetPresContext();
|
||||||
|
if (mRanges.Length() > 1 && presContext) {
|
||||||
|
SelectFramesInAllRanges(presContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SetDirection(aDirection);
|
SetDirection(aDirection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -697,6 +697,12 @@ class Selection final : public nsSupportsWeakReference,
|
||||||
nsresult SelectFrames(nsPresContext* aPresContext, nsRange* aRange,
|
nsresult SelectFrames(nsPresContext* aPresContext, nsRange* aRange,
|
||||||
bool aSelect);
|
bool aSelect);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SelectFramesInAllRanges() calls SelectFrames() for all current
|
||||||
|
* ranges.
|
||||||
|
*/
|
||||||
|
void SelectFramesInAllRanges(nsPresContext* aPresContext);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test whether the supplied range points to a single table element.
|
* Test whether the supplied range points to a single table element.
|
||||||
* Result is one of the TableSelection constants. "None" means
|
* Result is one of the TableSelection constants. "None" means
|
||||||
|
|
Загрузка…
Ссылка в новой задаче