Closed Bug 1393816 Opened 7 years ago Closed 7 years ago

Selection should cache a range if a range isn't referred other than the Selection instance and Selection::Collapse() should reuse it

Categories

(Core :: DOM: Selection, enhancement)

enhancement
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla57
Tracking Status
firefox57 --- fixed

People

(Reporter: masayuki, Assigned: masayuki)

References

(Blocks 2 open bugs)

Details

Attachments

(2 files)

When setting value of <input type="text">, nsTextEditorState::SetValue() removes all ranges of normal selection first. Then, EditorBase::AfterEdit() will set selection to the end of the editor with Selection::Collapse().

In this case, when Selection::Collapse() is called, there are no ranges due to RemoveAllRanges() is called. Therefore, it cannot reuse existing instance.

From the point of view of caller of Selection::RemoveAllRanges(), they can guarantee that a range will be necessary immediately after that. So, adding Selection::RemoveAllRangesTemporarily() and cache a range if a range isn't referred other than the Selection instance, Selection::Collapse() can reuse the cache and reduce the allocation cost (and some other cost like adding mutation observer).
Comment on attachment 8901408 [details]
Bug 1393816 - part1: Cache a range until new range is created in Selection

https://reviewboard.mozilla.org/r/172884/#review178306

::: commit-message-b2cef:4
(Diff revision 1)
> +Bug 1393816 - part1: Cache a range until new range is created in Selection r?smaug
> +
> +When setting value of <input type="text">, nsTextEditorState removes all
> +rages of normal selection first.  Then, TextEditor sets the value.  Finally,

ranges

::: commit-message-b2cef:5
(Diff revision 1)
> +Bug 1393816 - part1: Cache a range until new range is created in Selection r?smaug
> +
> +When setting value of <input type="text">, nsTextEditorState removes all
> +rages of normal selection first.  Then, TextEditor sets the value.  Finally,
> +TextEditor collapse selection at the end of the editor.

collapses the selection

end of what? End of text I guess, not editor.

::: dom/base/Selection.h:221
(Diff revision 1)
>    void RemoveAllRanges(mozilla::ErrorResult& aRv);
>  
> +  /**
> +   * RemoveAllRangesTemporarily() is useful if the caller will add one or more
> +   * ranges later.  This tries to cache a removing range if it's possible.
> +   * If a range is not referred by other than this selection, the range can be

s/other/anything else/
Attachment #8901408 - Flags: review?(bugs) → review+
Comment on attachment 8901409 [details]
Bug 1393816 - part2: Selection::SetBaseAndExtent() should use mCachedRange if it's available

https://reviewboard.mozilla.org/r/172886/#review178308

::: dom/base/Selection.h:488
(Diff revision 1)
>    RefPtr<nsRange> mAnchorFocusRange;
>    // mCachedRange is set by RemoveAllRangesTemporarily() and used by
> -  // Collapse().  If there is a range which will be released by Clear(),
> -  // RemoveAllRangesTemporarily() stores it with this.  If Collapse() is
> -  // called without existing ranges, it'll reuse this range for saving the
> -  // creating cost.
> +  // Collapse() and SetBaseAndExtent().  If there is a range which will be
> +  // released by Clear(), RemoveAllRangesTemporarily() stores it with this.
> +  // If Collapse() is called without existing ranges, it'll reuse this range
> +  // for saving the creating cost.

creation cost
Attachment #8901409 - Flags: review?(bugs) → review+
Comment on attachment 8901408 [details]
Bug 1393816 - part1: Cache a range until new range is created in Selection

https://reviewboard.mozilla.org/r/172884/#review178306

> collapses the selection
> 
> end of what? End of text I guess, not editor.

Yes.
Pushed by masayuki@d-toybox.com:
https://hg.mozilla.org/integration/autoland/rev/d311ad8f8c76
part1: Cache a range until new range is created in Selection r=smaug
https://hg.mozilla.org/integration/autoland/rev/fbc63e299cd0
part2: Selection::SetBaseAndExtent() should use mCachedRange if it's available r=smaug
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: