Closed Bug 1393348 Opened 7 years ago Closed 7 years ago

Optimize retrieving selection from nsTextEditorState

Categories

(Core :: DOM: Editor, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla57
Tracking Status
firefox57 --- fixed

People

(Reporter: masayuki, Assigned: masayuki)

References

(Blocks 1 open bug)

Details

Attachments

(3 files)

I see nsTextInputSelectionImpl::GetSelection(RawSelectionType, nsISelection**) and nsFrameSelection::GetSelection() in the profile at running attachment 8848015 [details].
Comment on attachment 8900970 [details]
Bug 1393348 - part1: nsTextEditorState should use nsTextInputSelectionImpl::GetSelection(SelectionType) instead of nsTextInputSelectionImpl::GetSelection(RawSelectionType, nsISelection**)

https://reviewboard.mozilla.org/r/172194/#review177708
Attachment #8900970 - Flags: review?(m_kato) → review+
Comment on attachment 8900972 [details]
Bug 1393348 - part3: Converting SelectionType to index of Selection array in nsFrameSelection should use array instead of switch statement

https://reviewboard.mozilla.org/r/172198/#review177888

::: layout/generic/nsFrameSelection.cpp:165
(Diff revision 1)
> +};
> +
> +inline int8_t
>  GetIndexFromSelectionType(SelectionType aSelectionType)
>  {
> -  switch (aSelectionType) {
> +  return kIndexOfSelections[static_cast<int8_t>(aSelectionType) + 1];

I don't understand this. SelectionType NORMAL is 1, so we get index 2 here, no?
Were you going to use - 1?
Attachment #8900972 - Flags: review?(bugs) → review-
Comment on attachment 8900971 [details]
Bug 1393348 - part2: nsISelectionController::SELECTION_* should be sequential integer values

https://reviewboard.mozilla.org/r/172196/#review177890

::: dom/base/nsISelectionController.idl:309
(Diff revision 1)
> +
> +// SelectionType should be used in internal handling because of type safe.
>  enum class SelectionType : RawSelectionType
>  {
>    eInvalid = -1,
> -  eNone = nsISelectionController::SELECTION_NONE,
> +  // nsISelectionController::SELECTION_NONE

why you don't assign the value explicitly anymore? SELECTION_NONE is 0 and so is eNone.

::: layout/generic/nsTextFrame.cpp:7744
(Diff revision 1)
>  
>    UniquePtr<SelectionDetails> details = GetSelectionDetails();
>    for (SelectionDetails* sd = details.get(); sd; sd = sd->mNext.get()) {
>      if (sd->mStart == sd->mEnd ||
> -        !(sd->mSelectionType & kRawSelectionTypesWithDecorations) ||
> +        sd->mSelectionType == SelectionType::eInvalid ||
> +        !(sd->mSelectionType & kSelectionTypesWithDecorations) ||

Why is this right. mSelectionType isn't in bitmask form.

::: layout/generic/nsTextFrame.cpp:7822
(Diff revision 1)
>    nsPresContext* presContext = PresContext();
>    while (f && f->GetContentOffset() < int32_t(aEnd)) {
>      // We may need to reflow to recompute the overflow area for
>      // spellchecking or IME underline if their underline is thicker than
>      // the normal decoration line.
> -    if (aSelectionType & kRawSelectionTypesWithDecorations) {
> +    if (aSelectionType & kSelectionTypesWithDecorations) {

Why is this right? aSelection type isn't in bitmask form.
Attachment #8900971 - Flags: review?(bugs) → review-
Comment on attachment 8900972 [details]
Bug 1393348 - part3: Converting SelectionType to index of Selection array in nsFrameSelection should use array instead of switch statement

https://reviewboard.mozilla.org/r/172198/#review177888

> I don't understand this. SelectionType NORMAL is 1, so we get index 2 here, no?
> Were you going to use - 1?

The array is storing from index of eInvalid (-1). Therefore, index for eNormal is stored at 2. That the reason why I added +1.

I'd like to get rid of if/switch from the method.
Comment on attachment 8900971 [details]
Bug 1393348 - part2: nsISelectionController::SELECTION_* should be sequential integer values

https://reviewboard.mozilla.org/r/172196/#review177890

> why you don't assign the value explicitly anymore? SELECTION_NONE is 0 and so is eNone.

Okay. I'll revert the changes.

> Why is this right. mSelectionType isn't in bitmask form.

Because of SelectionType has custom & operator override. See Selection.h.

Or, should I create SelectionTypeIsIncluded(SelectionType, SelectionTypeMask)? But it may make other developers confused which is SelectionType and SelectionTypeMask. I we could write it as SelectionTypeMask::Includes(SelectionType)...

> Why is this right? aSelection type isn't in bitmask form.

See above. The & operator is overridden in Selection.h (declared in nsISelectionController.idl).
setting ni? because I need reply for the above before I rewrote the patches.
Flags: needinfo?(bugs)
Comment on attachment 8900972 [details]
Bug 1393348 - part3: Converting SelectionType to index of Selection array in nsFrameSelection should use array instead of switch statement

https://reviewboard.mozilla.org/r/172198/#review178108

oh, I see. Could you add some comment.
Attachment #8900972 - Flags: review- → review+
Comment on attachment 8900971 [details]
Bug 1393348 - part2: nsISelectionController::SELECTION_* should be sequential integer values

https://reviewboard.mozilla.org/r/172196/#review178114

::: dom/base/Selection.h:582
(Diff revision 1)
> +  MOZ_ASSERT(aSelectionType != SelectionType::eInvalid);
> +  return aSelectionType == SelectionType::eNone ? 0 :
> +           (1 << (static_cast<uint8_t>(aSelectionType) - 1));
> +}
> +
>  inline bool operator &(SelectionType aSelectionType,

Could we get rid of this operator& and just explicitly call ToSelectionTypeMask when needed.
Comment on attachment 8900971 [details]
Bug 1393348 - part2: nsISelectionController::SELECTION_* should be sequential integer values

https://reviewboard.mozilla.org/r/172196/#review178114

> Could we get rid of this operator& and just explicitly call ToSelectionTypeMask when needed.

Ah, I should've gone to the bed for refreshing my brain :-(
Comment on attachment 8900971 [details]
Bug 1393348 - part2: nsISelectionController::SELECTION_* should be sequential integer values

https://reviewboard.mozilla.org/r/172196/#review178310
Attachment #8900971 - Flags: review?(bugs) → review+
Pushed by masayuki@d-toybox.com:
https://hg.mozilla.org/integration/autoland/rev/fc9c5f963abf
part1: nsTextEditorState should use nsTextInputSelectionImpl::GetSelection(SelectionType) instead of nsTextInputSelectionImpl::GetSelection(RawSelectionType, nsISelection**) r=m_kato
https://hg.mozilla.org/integration/autoland/rev/a69d5ede21ba
part2: nsISelectionController::SELECTION_* should be sequential integer values r=smaug
https://hg.mozilla.org/integration/autoland/rev/156c3f4e0b16
part3: Converting SelectionType to index of Selection array in nsFrameSelection should use array instead of switch statement r=smaug
Flags: needinfo?(bugs)
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: