void VisibleSelection::validate(TextGranularity granularity) { setBaseAndExtentToDeepEquivalents(); setStartAndEndFromBaseAndExtentRespectingGranularity(granularity); adjustSelectionToAvoidCrossingShadowBoundaries(); adjustSelectionToAvoidCrossingEditingBoundaries(); updateSelectionType(); if (selectionType() == RangeSelection) { // "Constrain" the selection to be the smallest equivalent range of nodes. // This is a somewhat arbitrary choice, but experience shows that it is // useful to make to make the selection "canonical" (if only for // purposes of comparing selections). This is an ideal point of the code // to do this operation, since all selection changes that result in a RANGE // come through here before anyone uses it. // FIXME: Canonicalizing is good, but haven't we already done it (when we // set these two positions to VisiblePosition deepEquivalent()s above)? m_start = m_start.downstream(); m_end = m_end.upstream(); // FIXME: Position::downstream() or Position::upStream() might violate editing boundaries // if an anchor node has a Shadow DOM. So we adjust selection to avoid crossing editing // boundaries again. See https://bugs.webkit.org/show_bug.cgi?id=87463 adjustSelectionToAvoidCrossingEditingBoundaries(); } }
void VisibleSelection::validate() { setBaseAndExtentToDeepEquivalents(); setStartAndEndFromBaseAndExtentRespectingGranularity(); adjustSelectionToAvoidCrossingEditingBoundaries(); updateSelectionType(); if (selectionType() == RangeSelection) { // "Constrain" the selection to be the smallest equivalent range of nodes. // This is a somewhat arbitrary choice, but experience shows that it is // useful to make to make the selection "canonical" (if only for // purposes of comparing selections). This is an ideal point of the code // to do this operation, since all selection changes that result in a RANGE // come through here before anyone uses it. // FIXME: Canonicalizing is good, but haven't we already done it (when we // set these two positions to VisiblePosition deepEquivalent()s above)? m_start = m_start.downstream(); m_end = m_end.upstream(); } }