+2014-02-08 Ryosuke Niwa <rniwa@webkit.org>
+
+ Split UserTriggered into FireSelectEvent and RevealSelection for selection options
+ https://bugs.webkit.org/show_bug.cgi?id=128441
+
+ Reviewed by Darin Adler.
+
+ Split UserTriggered by FireSelectEvent and RevealSelection for selection options.
+
+ Also added defaultSetSelectionOptions() to abstract away the default options.
+
+ * editing/AlternativeTextController.cpp:
+ (WebCore::AlternativeTextController::respondToUnappliedSpellCorrection):
+ * editing/Editor.cpp:
+ (WebCore::Editor::unappliedEditing):
+ (WebCore::Editor::reappliedEditing):
+ * editing/FrameSelection.cpp:
+ (WebCore::FrameSelection::moveTo):
+ (WebCore::FrameSelection::setSelectionByMouseIfDifferent): UserTriggered | DoNotRevealSelection
+ is replaced by FireSelectEvent.
+ (WebCore::FrameSelection::setSelectionWithoutUpdatingAppearance): Check options & FireSelectEvent
+ instead of options & UserTriggered.
+ (WebCore::FrameSelection::setSelection): Check options & RevealSelection instead of
+ options & UserTriggered && !(options & DoNotRevealSelection).
+ (WebCore::FrameSelection::prepareForDestruction):
+ (WebCore::FrameSelection::setBase):
+ (WebCore::FrameSelection::setExtent):
+ (WebCore::FrameSelection::selectAll):
+ (WebCore::FrameSelection::wordSelectionContainingCaretSelection):
+ * editing/FrameSelection.h:
+ (WebCore::FrameSelection::defaultSetSelectionOptions): Added.
+ * editing/SpellingCorrectionCommand.cpp:
+ (WebCore::SpellingCorrectionCommand::doApply):
+ * html/HTMLTextFormControlElement.cpp:
+ (WebCore::HTMLTextFormControlElement::selectionChanged): Renamed the argument.
+ * html/HTMLTextFormControlElement.h:
+
2014-02-08 Zan Dobersek <zdobersek@igalia.com>
Move TreeScope, IdTargetObserverRegistry to std::unique_ptr
void FrameSelection::moveTo(const VisiblePosition &pos, EUserTriggered userTriggered, CursorAlignOnScroll align)
{
- SetSelectionOptions options = CloseTyping | ClearTypingStyle | userTriggered;
- setSelection(VisibleSelection(pos.deepEquivalent(), pos.deepEquivalent(), pos.affinity(), m_selection.isDirectional()), options, align);
+ setSelection(VisibleSelection(pos.deepEquivalent(), pos.deepEquivalent(), pos.affinity(), m_selection.isDirectional()),
+ defaultSetSelectionOptions(userTriggered), align);
}
void FrameSelection::moveTo(const VisiblePosition &base, const VisiblePosition &extent, EUserTriggered userTriggered)
{
const bool selectionHasDirection = true;
- SetSelectionOptions options = CloseTyping | ClearTypingStyle | userTriggered;
- setSelection(VisibleSelection(base.deepEquivalent(), extent.deepEquivalent(), base.affinity(), selectionHasDirection), options);
+ setSelection(VisibleSelection(base.deepEquivalent(), extent.deepEquivalent(), base.affinity(), selectionHasDirection), defaultSetSelectionOptions(userTriggered));
}
void FrameSelection::moveTo(const Position &pos, EAffinity affinity, EUserTriggered userTriggered)
{
- SetSelectionOptions options = CloseTyping | ClearTypingStyle | userTriggered;
- setSelection(VisibleSelection(pos, affinity, m_selection.isDirectional()), options);
+ setSelection(VisibleSelection(pos, affinity, m_selection.isDirectional()), defaultSetSelectionOptions(userTriggered));
}
void FrameSelection::moveTo(const Range *r, EAffinity affinity, EUserTriggered userTriggered)
{
- SetSelectionOptions options = CloseTyping | ClearTypingStyle | userTriggered;
VisibleSelection selection = r ? VisibleSelection(r->startPosition(), r->endPosition(), affinity) : VisibleSelection(Position(), Position(), affinity);
- setSelection(selection, options);
+ setSelection(selection, defaultSetSelectionOptions(userTriggered));
}
void FrameSelection::moveTo(const Position &base, const Position &extent, EAffinity affinity, EUserTriggered userTriggered)
{
const bool selectionHasDirection = true;
- SetSelectionOptions options = CloseTyping | ClearTypingStyle | userTriggered;
- setSelection(VisibleSelection(base, extent, affinity, selectionHasDirection), options);
+ setSelection(VisibleSelection(base, extent, affinity, selectionHasDirection), defaultSetSelectionOptions(userTriggered));
}
void DragCaretController::setCaretPosition(const VisiblePosition& position)
if (m_selection == newSelection || !shouldChangeSelection(newSelection))
return;
- setSelection(newSelection, UserTriggered | DoNotRevealSelection | CloseTyping | ClearTypingStyle, AlignCursorOnScrollIfNeeded, granularity);
+ setSelection(newSelection, defaultSetSelectionOptions() | FireSelectEvent, AlignCursorOnScrollIfNeeded, granularity);
}
-bool FrameSelection::setSelectionWithoutUpdatingAppearance(const VisibleSelection& newSelectionPossiblyWithoutDirection, SetSelectionOptions options, CursorAlignOnScroll align, TextGranularity granularity, EUserTriggered userTriggered)
+bool FrameSelection::setSelectionWithoutUpdatingAppearance(const VisibleSelection& newSelectionPossiblyWithoutDirection, SetSelectionOptions options, CursorAlignOnScroll align, TextGranularity granularity)
{
bool closeTyping = options & CloseTyping;
bool shouldClearTypingStyle = options & ClearTypingStyle;
// Selection offsets should increase when LF is inserted before the caret in InsertLineBreakCommand. See <https://webkit.org/b/56061>.
if (HTMLTextFormControlElement* textControl = enclosingTextFormControl(newSelection.start()))
- textControl->selectionChanged(userTriggered == UserTriggered);
+ textControl->selectionChanged(options & FireSelectEvent);
if (oldSelection == newSelection)
return false;
void FrameSelection::setSelection(const VisibleSelection& selection, SetSelectionOptions options, CursorAlignOnScroll align, TextGranularity granularity)
{
- EUserTriggered userTriggered = selectionOptionsToUserTriggered(options);
- if (!setSelectionWithoutUpdatingAppearance(selection, options, align, granularity, userTriggered))
+ if (!setSelectionWithoutUpdatingAppearance(selection, options, align, granularity))
return;
#if ENABLE(TEXT_CARET)
#endif
updateAppearance();
- if (userTriggered == UserTriggered && !(options & DoNotRevealSelection)) {
+ if (options & RevealSelection) {
ScrollAlignment alignment;
if (m_frame->editor().behavior().shouldCenterAlignWhenSelectionIsRevealed())
if (view)
view->clearSelection();
- setSelectionWithoutUpdatingAppearance(VisibleSelection(), CloseTyping | ClearTypingStyle,
- AlignCursorOnScrollIfNeeded, CharacterGranularity, NotUserTriggered);
+ setSelectionWithoutUpdatingAppearance(VisibleSelection(), defaultSetSelectionOptions(), AlignCursorOnScrollIfNeeded, CharacterGranularity);
m_previousCaretNode.clear();
}
void FrameSelection::setBase(const VisiblePosition &pos, EUserTriggered userTriggered)
{
const bool selectionHasDirection = true;
- setSelection(VisibleSelection(pos.deepEquivalent(), m_selection.extent(), pos.affinity(), selectionHasDirection), CloseTyping | ClearTypingStyle | userTriggered);
+ setSelection(VisibleSelection(pos.deepEquivalent(), m_selection.extent(), pos.affinity(), selectionHasDirection), defaultSetSelectionOptions(userTriggered));
}
void FrameSelection::setExtent(const VisiblePosition &pos, EUserTriggered userTriggered)
{
const bool selectionHasDirection = true;
- setSelection(VisibleSelection(m_selection.base(), pos.deepEquivalent(), pos.affinity(), selectionHasDirection), CloseTyping | ClearTypingStyle | userTriggered);
+ setSelection(VisibleSelection(m_selection.base(), pos.deepEquivalent(), pos.affinity(), selectionHasDirection), defaultSetSelectionOptions(userTriggered));
}
void FrameSelection::setBase(const Position &pos, EAffinity affinity, EUserTriggered userTriggered)
{
const bool selectionHasDirection = true;
- setSelection(VisibleSelection(pos, m_selection.extent(), affinity, selectionHasDirection), CloseTyping | ClearTypingStyle | userTriggered);
+ setSelection(VisibleSelection(pos, m_selection.extent(), affinity, selectionHasDirection), defaultSetSelectionOptions(userTriggered));
}
void FrameSelection::setExtent(const Position &pos, EAffinity affinity, EUserTriggered userTriggered)
{
const bool selectionHasDirection = true;
- setSelection(VisibleSelection(m_selection.base(), pos, affinity, selectionHasDirection), CloseTyping | ClearTypingStyle | userTriggered);
+ setSelection(VisibleSelection(m_selection.base(), pos, affinity, selectionHasDirection), defaultSetSelectionOptions(userTriggered));
}
void CaretBase::clearCaretRect()
VisibleSelection newSelection(VisibleSelection::selectionFromContentsOfNode(root.get()));
if (shouldChangeSelection(newSelection))
- setSelection(newSelection, UserTriggered | CloseTyping | ClearTypingStyle | DoNotRevealSelection);
+ setSelection(newSelection, defaultSetSelectionOptions() | FireSelectEvent);
}
bool FrameSelection::setSelectedRange(Range* range, EAffinity affinity, bool closeTyping)
VisibleSelection newSelection = frameSelection.selection();
newSelection.expandUsingGranularity(WordGranularity);
- frameSelection.setSelection(newSelection, CloseTyping | ClearTypingStyle, AlignCursorOnScrollIfNeeded, frameSelection.granularity());
+ frameSelection.setSelection(newSelection, defaultSetSelectionOptions(), AlignCursorOnScrollIfNeeded, frameSelection.granularity());
Position startPos(frameSelection.selection().start());
Position endPos(frameSelection.selection().end());
enum CursorAlignOnScroll { AlignCursorOnScrollIfNeeded,
AlignCursorOnScrollAlways };
enum SetSelectionOption {
- // 1 << 0 is reserved for EUserTriggered
+ FireSelectEvent = 1 << 0,
CloseTyping = 1 << 1,
ClearTypingStyle = 1 << 2,
SpellCorrectionTriggered = 1 << 3,
DoNotSetFocus = 1 << 4,
DictationTriggered = 1 << 5,
- DoNotRevealSelection = 1 << 6,
+ RevealSelection = 1 << 6,
};
typedef unsigned SetSelectionOptions; // Union of values in SetSelectionOption and EUserTriggered
- static inline EUserTriggered selectionOptionsToUserTriggered(SetSelectionOptions options)
+ static inline SetSelectionOptions defaultSetSelectionOptions(EUserTriggered userTriggered = NotUserTriggered)
{
- return static_cast<EUserTriggered>(options & UserTriggered);
+ return CloseTyping | ClearTypingStyle | (userTriggered ? (RevealSelection | FireSelectEvent) : 0);
}
explicit FrameSelection(Frame* = 0);
void moveTo(const Position&, const Position&, EAffinity, EUserTriggered = NotUserTriggered);
const VisibleSelection& selection() const { return m_selection; }
- void setSelection(const VisibleSelection&, SetSelectionOptions = CloseTyping | ClearTypingStyle, CursorAlignOnScroll = AlignCursorOnScrollIfNeeded, TextGranularity = CharacterGranularity);
+ void setSelection(const VisibleSelection&, SetSelectionOptions = defaultSetSelectionOptions(), CursorAlignOnScroll = AlignCursorOnScrollIfNeeded, TextGranularity = CharacterGranularity);
bool setSelectedRange(Range*, EAffinity, bool closeTyping);
void selectAll();
void clear();
private:
enum EPositionType { START, END, BASE, EXTENT };
- bool setSelectionWithoutUpdatingAppearance(const VisibleSelection&, SetSelectionOptions, CursorAlignOnScroll, TextGranularity, EUserTriggered);
+ bool setSelectionWithoutUpdatingAppearance(const VisibleSelection&, SetSelectionOptions, CursorAlignOnScroll, TextGranularity);
void respondToNodeModification(Node*, bool baseRemoved, bool extentRemoved, bool startRemoved, bool endRemoved);
TextDirection directionOfEnclosingBlock();