Changeset 222697 in webkit


Ignore:
Timestamp:
Oct 1, 2017 9:46:32 PM (7 years ago)
Author:
Alan Bujtas
Message:

RenderView does not need to be a SelectionSubtreeRoot
https://bugs.webkit.org/show_bug.cgi?id=177713

Reviewed by Darin Adler and Antti Koivisto.

  1. SelectionSubtreeRoot -> SelectionRangeData
  2. Move all selection logic from RenderView to SelectionRangeData
  3. class RenderView : public SelectionSubtreeRoot -> SelectionRangeData m_selection;
  4. Remove redundant code
  5. General modernization

No change in functionality.

  • editing/FrameSelection.cpp:

(WebCore::FrameSelection::setNeedsSelectionUpdate):
(WebCore::DragCaretController::nodeWillBeRemoved):
(WebCore::FrameSelection::respondToNodeModification):
(WebCore::FrameSelection::prepareForDestruction):
(WebCore::FrameSelection::focusedOrActiveStateChanged):
(WebCore::FrameSelection::updateAppearance):
(WebCore::FrameSelection::selectionBounds const):

  • page/FrameView.cpp:

(WebCore::FrameView::paintContentsForSnapshot):

  • platform/DragImage.cpp:

(WebCore::ScopedFrameSelectionState::ScopedFrameSelectionState):
(WebCore::ScopedFrameSelectionState::~ScopedFrameSelectionState):
(WebCore::createDragImageForRange):

  • rendering/InlineTextBox.cpp:

(WebCore::InlineTextBox::selectionState):
(WebCore::InlineTextBox::selectionStartEnd const):

  • rendering/RenderBlock.cpp:

(WebCore::RenderBlock::isSelectionRoot const):

  • rendering/RenderObject.cpp:

(WebCore::RenderObject::isSelectionBorder const):

  • rendering/RenderObject.h:
  • rendering/RenderReplaced.cpp:

(WebCore::RenderReplaced::isSelected const):

  • rendering/RenderText.cpp:

(WebCore::RenderText::collectSelectionRectsForLineBoxes):

  • rendering/RenderTextLineBoxes.cpp:

(WebCore::RenderTextLineBoxes::setSelectionState):

  • rendering/RenderView.cpp:

(WebCore::RenderView::RenderView):
(WebCore::SelectionIterator::SelectionIterator): Deleted.
(WebCore::SelectionIterator::current const): Deleted.
(WebCore::SelectionIterator::next): Deleted.
(WebCore::SelectionIterator::checkForSpanner): Deleted.
(WebCore::rendererAfterPosition): Deleted.
(WebCore::RenderView::selectionBounds const): Deleted.
(WebCore::RenderView::subtreeSelectionBounds const): Deleted.
(WebCore::RenderView::repaintSelection const): Deleted.
(WebCore::RenderView::repaintSubtreeSelection const): Deleted.
(WebCore::RenderView::setSelection): Deleted.
(WebCore::isValidObjectForNewSelection): Deleted.
(WebCore::RenderView::clearSubtreeSelection const): Deleted.
(WebCore::RenderView::applySubtreeSelection): Deleted.
(WebCore::RenderView::getSelection const): Deleted.
(WebCore::RenderView::clearSelection): Deleted.

  • rendering/RenderView.h:
  • rendering/SelectionSubtreeRoot.cpp:

(WebCore::rendererAfterPosition):
(WebCore::SelectionIterator::SelectionIterator):
(WebCore::SelectionIterator::current const):
(WebCore::SelectionIterator::next):
(WebCore::SelectionIterator::checkForSpanner):
(WebCore::SelectionRangeData::SelectionRangeData):
(WebCore::SelectionRangeData::set):
(WebCore::SelectionRangeData::clear):
(WebCore::SelectionRangeData::repaint const):
(WebCore::SelectionRangeData::bounds const):
(WebCore::SelectionRangeData::collectAndClear const):
(WebCore::SelectionRangeData::apply):
(WebCore::SelectionRangeData::isValidRendererForNewSelection const):
(WebCore::SelectionSubtreeRoot::SelectionSubtreeRoot): Deleted.

  • rendering/SelectionSubtreeRoot.h:

(WebCore::SelectionRangeData::Context::operator== const):
(WebCore::SelectionRangeData::get const):
(WebCore::SelectionRangeData::start const):
(WebCore::SelectionRangeData::end const):
(WebCore::SelectionRangeData::startPosition const):
(WebCore::SelectionRangeData::endPosition const):
(WebCore::SelectionSubtreeRoot::OldSelectionData::OldSelectionData): Deleted.
(WebCore::SelectionSubtreeRoot::SelectionSubtreeData::SelectionSubtreeData): Deleted.
(WebCore::SelectionSubtreeRoot::SelectionSubtreeData::selectionStart const): Deleted.
(WebCore::SelectionSubtreeRoot::SelectionSubtreeData::selectionStartPos const): Deleted.
(WebCore::SelectionSubtreeRoot::SelectionSubtreeData::selectionEnd const): Deleted.
(WebCore::SelectionSubtreeRoot::SelectionSubtreeData::selectionEndPos const): Deleted.
(WebCore::SelectionSubtreeRoot::SelectionSubtreeData::selectionStartEndPositions const): Deleted.
(WebCore::SelectionSubtreeRoot::SelectionSubtreeData::clearSelection): Deleted.
(WebCore::SelectionSubtreeRoot::selectionData): Deleted.
(WebCore::SelectionSubtreeRoot::selectionData const): Deleted.
(WebCore::SelectionSubtreeRoot::setSelectionData): Deleted.

Location:
trunk/Source/WebCore
Files:
2 added
2 deleted
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r222692 r222697  
    27502750    rendering/RootInlineBox.cpp
    27512751    rendering/ScrollAlignment.cpp
    2752     rendering/SelectionSubtreeRoot.cpp
     2752    rendering/SelectionRangeData.cpp
    27532753    rendering/SimpleLineLayout.cpp
    27542754    rendering/SimpleLineLayoutCoverage.cpp
  • trunk/Source/WebCore/ChangeLog

    r222695 r222697  
     12017-10-01  Zalan Bujtas  <zalan@apple.com>
     2
     3        RenderView does not need to be a SelectionSubtreeRoot
     4        https://bugs.webkit.org/show_bug.cgi?id=177713
     5
     6        Reviewed by Darin Adler and Antti Koivisto.
     7
     8        1. SelectionSubtreeRoot -> SelectionRangeData
     9        2. Move all selection logic from RenderView to SelectionRangeData
     10        3. class RenderView : public SelectionSubtreeRoot -> SelectionRangeData m_selection;
     11        4. Remove redundant code
     12        5. General modernization
     13 
     14        No change in functionality.
     15
     16        * editing/FrameSelection.cpp:
     17        (WebCore::FrameSelection::setNeedsSelectionUpdate):
     18        (WebCore::DragCaretController::nodeWillBeRemoved):
     19        (WebCore::FrameSelection::respondToNodeModification):
     20        (WebCore::FrameSelection::prepareForDestruction):
     21        (WebCore::FrameSelection::focusedOrActiveStateChanged):
     22        (WebCore::FrameSelection::updateAppearance):
     23        (WebCore::FrameSelection::selectionBounds const):
     24        * page/FrameView.cpp:
     25        (WebCore::FrameView::paintContentsForSnapshot):
     26        * platform/DragImage.cpp:
     27        (WebCore::ScopedFrameSelectionState::ScopedFrameSelectionState):
     28        (WebCore::ScopedFrameSelectionState::~ScopedFrameSelectionState):
     29        (WebCore::createDragImageForRange):
     30        * rendering/InlineTextBox.cpp:
     31        (WebCore::InlineTextBox::selectionState):
     32        (WebCore::InlineTextBox::selectionStartEnd const):
     33        * rendering/RenderBlock.cpp:
     34        (WebCore::RenderBlock::isSelectionRoot const):
     35        * rendering/RenderObject.cpp:
     36        (WebCore::RenderObject::isSelectionBorder const):
     37        * rendering/RenderObject.h:
     38        * rendering/RenderReplaced.cpp:
     39        (WebCore::RenderReplaced::isSelected const):
     40        * rendering/RenderText.cpp:
     41        (WebCore::RenderText::collectSelectionRectsForLineBoxes):
     42        * rendering/RenderTextLineBoxes.cpp:
     43        (WebCore::RenderTextLineBoxes::setSelectionState):
     44        * rendering/RenderView.cpp:
     45        (WebCore::RenderView::RenderView):
     46        (WebCore::SelectionIterator::SelectionIterator): Deleted.
     47        (WebCore::SelectionIterator::current const): Deleted.
     48        (WebCore::SelectionIterator::next): Deleted.
     49        (WebCore::SelectionIterator::checkForSpanner): Deleted.
     50        (WebCore::rendererAfterPosition): Deleted.
     51        (WebCore::RenderView::selectionBounds const): Deleted.
     52        (WebCore::RenderView::subtreeSelectionBounds const): Deleted.
     53        (WebCore::RenderView::repaintSelection const): Deleted.
     54        (WebCore::RenderView::repaintSubtreeSelection const): Deleted.
     55        (WebCore::RenderView::setSelection): Deleted.
     56        (WebCore::isValidObjectForNewSelection): Deleted.
     57        (WebCore::RenderView::clearSubtreeSelection const): Deleted.
     58        (WebCore::RenderView::applySubtreeSelection): Deleted.
     59        (WebCore::RenderView::getSelection const): Deleted.
     60        (WebCore::RenderView::clearSelection): Deleted.
     61        * rendering/RenderView.h:
     62        * rendering/SelectionSubtreeRoot.cpp:
     63        (WebCore::rendererAfterPosition):
     64        (WebCore::SelectionIterator::SelectionIterator):
     65        (WebCore::SelectionIterator::current const):
     66        (WebCore::SelectionIterator::next):
     67        (WebCore::SelectionIterator::checkForSpanner):
     68        (WebCore::SelectionRangeData::SelectionRangeData):
     69        (WebCore::SelectionRangeData::set):
     70        (WebCore::SelectionRangeData::clear):
     71        (WebCore::SelectionRangeData::repaint const):
     72        (WebCore::SelectionRangeData::bounds const):
     73        (WebCore::SelectionRangeData::collectAndClear const):
     74        (WebCore::SelectionRangeData::apply):
     75        (WebCore::SelectionRangeData::isValidRendererForNewSelection const):
     76        (WebCore::SelectionSubtreeRoot::SelectionSubtreeRoot): Deleted.
     77        * rendering/SelectionSubtreeRoot.h:
     78        (WebCore::SelectionRangeData::Context::operator== const):
     79        (WebCore::SelectionRangeData::get const):
     80        (WebCore::SelectionRangeData::start const):
     81        (WebCore::SelectionRangeData::end const):
     82        (WebCore::SelectionRangeData::startPosition const):
     83        (WebCore::SelectionRangeData::endPosition const):
     84        (WebCore::SelectionSubtreeRoot::OldSelectionData::OldSelectionData): Deleted.
     85        (WebCore::SelectionSubtreeRoot::SelectionSubtreeData::SelectionSubtreeData): Deleted.
     86        (WebCore::SelectionSubtreeRoot::SelectionSubtreeData::selectionStart const): Deleted.
     87        (WebCore::SelectionSubtreeRoot::SelectionSubtreeData::selectionStartPos const): Deleted.
     88        (WebCore::SelectionSubtreeRoot::SelectionSubtreeData::selectionEnd const): Deleted.
     89        (WebCore::SelectionSubtreeRoot::SelectionSubtreeData::selectionEndPos const): Deleted.
     90        (WebCore::SelectionSubtreeRoot::SelectionSubtreeData::selectionStartEndPositions const): Deleted.
     91        (WebCore::SelectionSubtreeRoot::SelectionSubtreeData::clearSelection): Deleted.
     92        (WebCore::SelectionSubtreeRoot::selectionData): Deleted.
     93        (WebCore::SelectionSubtreeRoot::selectionData const): Deleted.
     94        (WebCore::SelectionSubtreeRoot::setSelectionData): Deleted.
     95
    1962017-10-01  Sam Weinig  <sam@webkit.org>
    297
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r222692 r222697  
    64336433                CDCD41E71C3DDB0900965D99 /* ParsedContentRange.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDCD41E51C3DDB0900965D99 /* ParsedContentRange.cpp */; };
    64346434                CDCD41E81C3DDB0A00965D99 /* ParsedContentRange.h in Headers */ = {isa = PBXBuildFile; fileRef = CDCD41E61C3DDB0900965D99 /* ParsedContentRange.h */; settings = {ATTRIBUTES = (Private, ); }; };
    6435                 CDCFABBD18C0AF78006F8450 /* SelectionSubtreeRoot.h in Headers */ = {isa = PBXBuildFile; fileRef = CDCFABBB18C0AE31006F8450 /* SelectionSubtreeRoot.h */; settings = {ATTRIBUTES = (Private, ); }; };
    6436                 CDCFABBE18C0AF84006F8450 /* SelectionSubtreeRoot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDCFABBC18C0AF19006F8450 /* SelectionSubtreeRoot.cpp */; };
     6435                CDCFABBD18C0AF78006F8450 /* SelectionRangeData.h in Headers */ = {isa = PBXBuildFile; fileRef = CDCFABBB18C0AE31006F8450 /* SelectionRangeData.h */; settings = {ATTRIBUTES = (Private, ); }; };
     6436                CDCFABBE18C0AF84006F8450 /* SelectionRangeData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDCFABBC18C0AF19006F8450 /* SelectionRangeData.cpp */; };
    64376437                CDD7089618359F6F002B3DC6 /* SampleMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDD7089418359F6E002B3DC6 /* SampleMap.cpp */; };
    64386438                CDD7089718359F6F002B3DC6 /* SampleMap.h in Headers */ = {isa = PBXBuildFile; fileRef = CDD7089518359F6F002B3DC6 /* SampleMap.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1521515215                CDCD41E61C3DDB0900965D99 /* ParsedContentRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParsedContentRange.h; sourceTree = "<group>"; };
    1521615216                CDCE5CD014633BC900D47CCA /* EventTargetFactory.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EventTargetFactory.in; sourceTree = "<group>"; };
    15217                 CDCFABBB18C0AE31006F8450 /* SelectionSubtreeRoot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectionSubtreeRoot.h; sourceTree = "<group>"; };
    15218                 CDCFABBC18C0AF19006F8450 /* SelectionSubtreeRoot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectionSubtreeRoot.cpp; sourceTree = "<group>"; };
     15217                CDCFABBB18C0AE31006F8450 /* SelectionRangeData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectionRangeData.h; sourceTree = "<group>"; };
     15218                CDCFABBC18C0AF19006F8450 /* SelectionRangeData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectionRangeData.cpp; sourceTree = "<group>"; };
    1521915219                CDD1E525167BA56400CE820B /* TextTrackRepresentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTrackRepresentation.h; sourceTree = "<group>"; };
    1522015220                CDD7089418359F6E002B3DC6 /* SampleMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SampleMap.cpp; sourceTree = "<group>"; };
     
    2612926129                                5D925B650F64D4DD00B847F0 /* ScrollAlignment.cpp */,
    2613026130                                5D925B660F64D4DD00B847F0 /* ScrollAlignment.h */,
    26131                                 CDCFABBC18C0AF19006F8450 /* SelectionSubtreeRoot.cpp */,
    26132                                 CDCFABBB18C0AE31006F8450 /* SelectionSubtreeRoot.h */,
     26131                                CDCFABBC18C0AF19006F8450 /* SelectionRangeData.cpp */,
     26132                                CDCFABBB18C0AE31006F8450 /* SelectionRangeData.h */,
    2613326133                                E48944A0180B57D800F165D8 /* SimpleLineLayout.cpp */,
    2613426134                                E48944A1180B57D800F165D8 /* SimpleLineLayout.h */,
     
    3004130041                                2D5BC42716F882EE007048D0 /* SecurityPolicyViolationEvent.h in Headers */,
    3004230042                                B2C3DA2F0D006C1D00EF6F26 /* SegmentedString.h in Headers */,
     30043                                CDCFABBD18C0AF78006F8450 /* SelectionRangeData.h in Headers */,
    3004330044                                BEA807C90F714A0300524199 /* SelectionRect.h in Headers */,
    3004430045                                51405C89190B014400754F94 /* SelectionRectGatherer.h in Headers */,
    30045                                 CDCFABBD18C0AF78006F8450 /* SelectionSubtreeRoot.h in Headers */,
    3004630046                                E44B4BB4141650D7002B1D8B /* SelectorChecker.h in Headers */,
    3004730047                                432D3FE818A8658400D7DC03 /* SelectorCheckerTestFunctions.h in Headers */,
     
    3396633966                                974D2DA4146A535D00D51F8B /* SecurityPolicy.cpp in Sources */,
    3396733967                                B2C3DA2E0D006C1D00EF6F26 /* SegmentedString.cpp in Sources */,
     33968                                CDCFABBE18C0AF84006F8450 /* SelectionRangeData.cpp in Sources */,
    3396833969                                BEA807C80F714A0300524199 /* SelectionRect.cpp in Sources */,
    3396933970                                51405C88190B014400754F94 /* SelectionRectGatherer.cpp in Sources */,
    33970                                 CDCFABBE18C0AF84006F8450 /* SelectionSubtreeRoot.cpp in Sources */,
    3397133971                                E44B4BB3141650D7002B1D8B /* SelectorChecker.cpp in Sources */,
    3397233972                                26B999961804D54200D01121 /* SelectorCompiler.cpp in Sources */,
  • trunk/Source/WebCore/editing/FrameSelection.cpp

    r221064 r222697  
    388388    m_pendingSelectionUpdate = true;
    389389    if (RenderView* view = m_frame->contentRenderer())
    390         view->clearSelection();
     390        view->selection().clear();
    391391}
    392392
     
    444444
    445445    if (RenderView* view = node.document().renderView())
    446         view->clearSelection();
     446        view->selection().clear();
    447447
    448448    clear();
     
    507507    if (clearRenderTreeSelection) {
    508508        if (auto* renderView = node.document().renderView()) {
    509             renderView->clearSelection();
     509            renderView->selection().clear();
    510510
    511511            // Trigger a selection update so the selection will be set again.
     
    15181518#endif
    15191519
    1520     RenderView* view = m_frame->contentRenderer();
    1521     if (view)
    1522         view->clearSelection();
     1520    if (auto* view = m_frame->contentRenderer())
     1521        view->selection().clear();
    15231522
    15241523    setSelectionWithoutUpdatingAppearance(VisibleSelection(), defaultSetSelectionOptions(), AlignCursorOnScrollIfNeeded, CharacterGranularity);
     
    19961995    // we have to update places those colors were painted.
    19971996    if (RenderView* view = document->renderView())
    1998         view->repaintSelection();
     1997        view->selection().repaint();
    19991998
    20001999    // Caret appears in the active frame.
     
    20912090
    20922091    if (!selection.isRange()) {
    2093         view->clearSelection();
     2092        view->selection().clear();
    20942093        return;
    20952094    }
     
    21162115        int endOffset = endPos.deprecatedEditingOffset();
    21172116        ASSERT(startOffset >= 0 && endOffset >= 0);
    2118         view->setSelection(startRenderer, startOffset, endRenderer, endOffset);
     2117        view->selection().set({ startRenderer, endRenderer, startOffset, endOffset });
    21192118    }
    21202119}
     
    22332232
    22342233    updateSelectionByUpdatingLayoutOrStyle(*m_frame);
    2235     RenderView* root = m_frame->contentRenderer();
    2236     FrameView* view = m_frame->view();
    2237     if (!root || !view)
     2234    auto* renderView = m_frame->contentRenderer();
     2235    if (!renderView)
    22382236        return LayoutRect();
    22392237
    2240     LayoutRect selectionRect = root->selectionBounds(clipToVisibleContent);
    2241     return clipToVisibleContent ? intersection(selectionRect, view->visibleContentRect(ScrollableArea::LegacyIOSDocumentVisibleRect)) : selectionRect;
     2238    auto& selection = renderView->selection();
     2239    auto selectionRect = clipToVisibleContent ? selection.boundsClippedToVisibleContent() : selection.bounds();
     2240    return clipToVisibleContent ? intersection(selectionRect, renderView->frameView().visibleContentRect(ScrollableArea::LegacyIOSDocumentVisibleRect)) : selectionRect;
    22422241}
    22432242
  • trunk/Source/WebCore/page/FrameView.cpp

    r222682 r222697  
    45234523    if (shouldPaintSelection == ExcludeSelection) {
    45244524        for (auto* frame = m_frame.ptr(); frame; frame = frame->tree().traverseNext(m_frame.ptr())) {
    4525             if (RenderView* root = frame->contentRenderer())
    4526                 root->clearSelection();
     4525            if (auto* renderView = frame->contentRenderer())
     4526                renderView->selection().clear();
    45274527        }
    45284528    }
  • trunk/Source/WebCore/platform/DragImage.cpp

    r219998 r222697  
    136136        : frame(frame)
    137137    {
    138         if (RenderView* root = frame.contentRenderer())
    139             root->getSelection(startRenderer, startOffset, endRenderer, endOffset);
     138        if (auto* renderView = frame.contentRenderer())
     139            selection = renderView->selection().get();
    140140    }
    141141
    142142    ~ScopedFrameSelectionState()
    143143    {
    144         if (RenderView* root = frame.contentRenderer())
    145             root->setSelection(startRenderer, startOffset, endRenderer, endOffset, RenderView::RepaintNothing);
     144        if (auto* renderView = frame.contentRenderer()) {
     145            ASSERT(selection);
     146            renderView->selection().set(selection.value(), SelectionRangeData::RepaintMode::Nothing);
     147        }
    146148    }
    147149
    148150    const Frame& frame;
    149     RenderObject* startRenderer;
    150     RenderObject* endRenderer;
    151     std::optional<unsigned> startOffset;
    152     std::optional<unsigned> endOffset;
     151    std::optional<SelectionRangeData::Context> selection;
    153152};
    154153
     
    187186    int endOffset = end.deprecatedEditingOffset();
    188187    ASSERT(startOffset >= 0 && endOffset >= 0);
    189     view->setSelection(startRenderer, startOffset, endRenderer, endOffset, RenderView::RepaintNothing);
     188    view->selection().set({ startRenderer, endRenderer, startOffset, endOffset }, SelectionRangeData::RepaintMode::Nothing);
    190189    // We capture using snapshotFrameRect() because we fake up the selection using
    191190    // FrameView but snapshotSelection() uses the selection from the Frame itself.
    192     return createDragImageFromSnapshot(snapshotFrameRect(frame, view->selectionBounds(), options), nullptr);
     191    return createDragImageFromSnapshot(snapshotFrameRect(frame, view->selection().boundsClippedToVisibleContent(), options), nullptr);
    193192}
    194193
  • trunk/Source/WebCore/rendering/InlineTextBox.cpp

    r222677 r222697  
    145145    RenderObject::SelectionState state = renderer().selectionState();
    146146    if (state == RenderObject::SelectionStart || state == RenderObject::SelectionEnd || state == RenderObject::SelectionBoth) {
    147         unsigned startPos, endPos;
    148         renderer().view().getSelectionStartEnd(startPos, endPos);
     147        auto& selection = renderer().view().selection();
     148        auto startPos = selection.startPosition();
     149        auto endPos = selection.endPosition();
    149150        // The position after a hard line break is considered to be past its end.
    150151        ASSERT(start() + len() >= (isLineBreak() ? 1 : 0));
     
    640641        return { 0, m_len };
    641642   
    642     unsigned start;
    643     unsigned end;
    644     renderer().view().getSelectionStartEnd(start, end);
     643    auto start = renderer().view().selection().startPosition();
     644    auto end = renderer().view().selection().endPosition();
    645645    if (selectionState == RenderObject::SelectionStart)
    646646        end = renderer().textLength();
  • trunk/Source/WebCore/rendering/RenderBlock.cpp

    r222679 r222697  
    18661866        return true;
    18671867   
    1868     if (view().selectionUnsplitStart()) {
    1869         Node* startElement = view().selectionUnsplitStart()->node();
     1868    if (view().selection().start()) {
     1869        Node* startElement = view().selection().start()->node();
    18701870        if (startElement && startElement->rootEditableElement() == element())
    18711871            return true;
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r222679 r222697  
    14181418        || st == SelectionEnd
    14191419        || st == SelectionBoth
    1420         || view().selectionUnsplitStart() == this
    1421         || view().selectionUnsplitEnd() == this;
     1420        || view().selection().start() == this
     1421        || view().selection().end() == this;
    14221422}
    14231423
  • trunk/Source/WebCore/rendering/RenderObject.h

    r222682 r222697  
    6363class RenderFragmentContainer;
    6464class RenderTheme;
    65 class SelectionSubtreeRoot;
     65class SelectionRangeData;
    6666class TransformState;
    6767class VisiblePosition;
  • trunk/Source/WebCore/rendering/RenderReplaced.cpp

    r222677 r222697  
    645645bool RenderReplaced::isSelected() const
    646646{
    647     SelectionState s = selectionState();
    648     if (s == SelectionNone)
    649         return false;
    650     if (s == SelectionInside)
     647    SelectionState state = selectionState();
     648    if (state == SelectionNone)
     649        return false;
     650    if (state == SelectionInside)
    651651        return true;
    652652
    653     unsigned selectionStart, selectionEnd;
    654     view().getSelectionStartEnd(selectionStart, selectionEnd);
    655     if (s == SelectionStart)
    656         return selectionStart == 0;
    657        
     653    auto selectionStart = view().selection().startPosition();
     654    auto selectionEnd = view().selection().endPosition();
     655    if (state == SelectionStart)
     656        return !selectionStart;
     657
    658658    unsigned end = element()->hasChildNodes() ? element()->countChildNodes() : 1;
    659     if (s == SelectionEnd)
     659    if (state == SelectionEnd)
    660660        return selectionEnd == end;
    661     if (s == SelectionBoth)
    662         return selectionStart == 0 && selectionEnd == end;
    663        
     661    if (state == SelectionBoth)
     662        return !selectionStart && selectionEnd == end;
    664663    ASSERT_NOT_REACHED();
    665664    return false;
  • trunk/Source/WebCore/rendering/RenderText.cpp

    r222677 r222697  
    14421442    // Now calculate startPos and endPos for painting selection.
    14431443    // We include a selection while endPos > 0
    1444     unsigned startPos, endPos;
     1444    unsigned startPos;
     1445    unsigned endPos;
    14451446    if (selectionState() == SelectionInside) {
    14461447        // We are fully selected.
     
    14481449        endPos = textLength();
    14491450    } else {
    1450         view().getSelectionStartEnd(startPos, endPos);
     1451        startPos = view().selection().startPosition();
     1452        endPos = view().selection().endPosition();
    14511453        if (selectionState() == SelectionStart)
    14521454            endPos = textLength();
  • trunk/Source/WebCore/rendering/RenderTextLineBoxes.cpp

    r222677 r222697  
    447447    }
    448448
    449     unsigned start, end;
    450     renderer.view().getSelectionStartEnd(start, end);
     449    auto start = renderer.view().selection().startPosition();
     450    auto end = renderer.view().selection().endPosition();
    451451    if (state == RenderObject::SelectionStart) {
    452452        end = renderer.textLength();
    453 
    454453        // to handle selection from end of text to end of line
    455454        if (start && start == end)
  • trunk/Source/WebCore/rendering/RenderView.cpp

    r222682 r222697  
    2727#include "FloatingObjects.h"
    2828#include "Frame.h"
    29 #include "FrameSelection.h"
    3029#include "FrameView.h"
    3130#include "GraphicsContext.h"
     
    4847#include "RenderMultiColumnSpannerPlaceholder.h"
    4948#include "RenderQuote.h"
    50 #include "RenderSelectionInfo.h"
    5149#include "RenderWidget.h"
    5250#include "ScrollbarTheme.h"
     
    7977};
    8078
    81 struct SelectionIterator {
    82     SelectionIterator(RenderObject* start)
    83         : m_current(start)
    84     {
    85         checkForSpanner();
    86     }
    87    
    88     RenderObject* current() const
    89     {
    90         return m_current;
    91     }
    92    
    93     RenderObject* next()
    94     {
    95         RenderObject* currentSpan = m_spannerStack.isEmpty() ? nullptr : m_spannerStack.last()->spanner();
    96         m_current = m_current->nextInPreOrder(currentSpan);
    97         checkForSpanner();
    98         if (!m_current && currentSpan) {
    99             RenderObject* placeholder = m_spannerStack.last();
    100             m_spannerStack.removeLast();
    101             m_current = placeholder->nextInPreOrder();
    102             checkForSpanner();
    103         }
    104         return m_current;
    105     }
    106 
    107 private:
    108     void checkForSpanner()
    109     {
    110         if (!is<RenderMultiColumnSpannerPlaceholder>(m_current))
    111             return;
    112         auto& placeholder = downcast<RenderMultiColumnSpannerPlaceholder>(*m_current);
    113         m_spannerStack.append(&placeholder);
    114         m_current = placeholder.spanner();
    115     }
    116 
    117     RenderObject* m_current { nullptr };
    118     Vector<RenderMultiColumnSpannerPlaceholder*> m_spannerStack;
    119 };
    120 
    12179RenderView::RenderView(Document& document, RenderStyle&& style)
    12280    : RenderBlockFlow(document, WTFMove(style))
    12381    , m_frameView(*document.view())
     82    , m_selection(*this)
    12483    , m_lazyRepaintTimer(*this, &RenderView::lazyRepaintTimerFired)
    125 #if ENABLE(SERVICE_CONTROLS)
    126     , m_selectionRectGatherer(*this)
    127 #endif
    12884{
    12985    setIsRenderView();
     
    698654}
    699655
    700 static RenderObject* rendererAfterPosition(RenderObject* object, unsigned offset)
    701 {
    702     if (!object)
    703         return nullptr;
    704 
    705     RenderObject* child = object->childAt(offset);
    706     return child ? child : object->nextInPreOrderAfterChildren();
    707 }
    708 
    709 IntRect RenderView::selectionBounds(bool clipToVisibleContent) const
    710 {
    711     LayoutRect selRect = subtreeSelectionBounds(clipToVisibleContent);
    712     return snappedIntRect(selRect);
    713 }
    714 
    715 LayoutRect RenderView::subtreeSelectionBounds(bool clipToVisibleContent) const
    716 {
    717     typedef HashMap<RenderObject*, std::unique_ptr<RenderSelectionInfo>> SelectionMap;
    718     SelectionMap selectedObjects;
    719 
    720     RenderObject* os = selectionData().selectionStart();
    721     auto* selectionEnd = selectionData().selectionEnd();
    722     RenderObject* stop = nullptr;
    723     if (selectionEnd)
    724         stop = rendererAfterPosition(selectionEnd, selectionData().selectionEndPos().value());
    725     SelectionIterator selectionIterator(os);
    726     while (os && os != stop) {
    727         if ((os->canBeSelectionLeaf() || os == selectionData().selectionStart() || os == selectionData().selectionEnd()) && os->selectionState() != SelectionNone) {
    728             // Blocks are responsible for painting line gaps and margin gaps. They must be examined as well.
    729             selectedObjects.set(os, std::make_unique<RenderSelectionInfo>(*os, clipToVisibleContent));
    730             RenderBlock* cb = os->containingBlock();
    731             while (cb && !is<RenderView>(*cb)) {
    732                 std::unique_ptr<RenderSelectionInfo>& blockInfo = selectedObjects.add(cb, nullptr).iterator->value;
    733                 if (blockInfo)
    734                     break;
    735                 blockInfo = std::make_unique<RenderSelectionInfo>(*cb, clipToVisibleContent);
    736                 cb = cb->containingBlock();
    737             }
    738         }
    739 
    740         os = selectionIterator.next();
    741     }
    742 
    743     // Now create a single bounding box rect that encloses the whole selection.
    744     LayoutRect selRect;
    745     SelectionMap::iterator end = selectedObjects.end();
    746     for (SelectionMap::iterator i = selectedObjects.begin(); i != end; ++i) {
    747         RenderSelectionInfo* info = i->value.get();
    748         // RenderSelectionInfo::rect() is in the coordinates of the repaintContainer, so map to page coordinates.
    749         LayoutRect currRect = info->rect();
    750         if (RenderLayerModelObject* repaintContainer = info->repaintContainer()) {
    751             FloatQuad absQuad = repaintContainer->localToAbsoluteQuad(FloatRect(currRect));
    752             currRect = absQuad.enclosingBoundingBox();
    753         }
    754         selRect.unite(currRect);
    755     }
    756     return selRect;
    757 }
    758 
    759 void RenderView::repaintSelection() const
    760 {
    761     repaintSubtreeSelection();
    762 }
    763 
    764 void RenderView::repaintSubtreeSelection() const
    765 {
    766     HashSet<RenderBlock*> processedBlocks;
    767 
    768     auto* selectionEnd = selectionData().selectionEnd();
    769     RenderObject* end = nullptr;
    770     if (selectionEnd)
    771         end = rendererAfterPosition(selectionEnd, selectionData().selectionEndPos().value());
    772     SelectionIterator selectionIterator(selectionData().selectionStart());
    773     for (RenderObject* o = selectionIterator.current(); o && o != end; o = selectionIterator.next()) {
    774         if (!o->canBeSelectionLeaf() && o != selectionData().selectionStart() && o != selectionData().selectionEnd())
    775             continue;
    776         if (o->selectionState() == SelectionNone)
    777             continue;
    778 
    779         RenderSelectionInfo(*o, true).repaint();
    780 
    781         // Blocks are responsible for painting line gaps and margin gaps. They must be examined as well.
    782         for (RenderBlock* block = o->containingBlock(); block && !is<RenderView>(*block); block = block->containingBlock()) {
    783             if (!processedBlocks.add(block).isNewEntry)
    784                 break;
    785             RenderSelectionInfo(*block, true).repaint();
    786         }
    787     }
    788 }
    789 
    790 void RenderView::setSelection(RenderObject* start, std::optional<unsigned> startPos, RenderObject* end, std::optional<unsigned> endPos, SelectionRepaintMode blockRepaintMode)
    791 {
    792     // Make sure both our start and end objects are defined.
    793     // Check www.msnbc.com and try clicking around to find the case where this happened.
    794     if ((start && !end) || (end && !start))
    795         return;
    796 
    797     bool caretChanged = m_selectionWasCaret != frame().selection().isCaret();
    798     m_selectionWasCaret = frame().selection().isCaret();
    799     // Just return if the selection hasn't changed.
    800     if (m_selectionUnsplitStart == start && m_selectionUnsplitStartPos == startPos
    801         && m_selectionUnsplitEnd == end && m_selectionUnsplitEndPos == endPos && !caretChanged) {
    802         return;
    803     }
    804 
    805 #if ENABLE(SERVICE_CONTROLS)
    806     // Clear the current rects and create a notifier for the new rects we are about to gather.
    807     // The Notifier updates the Editor when it goes out of scope and is destroyed.
    808     std::unique_ptr<SelectionRectGatherer::Notifier> rectNotifier = m_selectionRectGatherer.clearAndCreateNotifier();
    809 #endif // ENABLE(SERVICE_CONTROLS)
    810     // Set global positions for new selection.
    811     m_selectionUnsplitStart = start;
    812     m_selectionUnsplitStartPos = startPos;
    813     m_selectionUnsplitEnd = end;
    814     m_selectionUnsplitEndPos = endPos;
    815     auto oldSelectionData = std::make_unique<OldSelectionData>();
    816     clearSubtreeSelection(blockRepaintMode, *oldSelectionData);
    817     setSelectionData(SelectionSubtreeData(start, startPos, end, endPos));
    818     applySubtreeSelection(blockRepaintMode, *oldSelectionData);
    819 }
    820 
    821 static inline bool isValidObjectForNewSelection(const RenderView& view, const RenderObject& object)
    822 {
    823     return (object.canBeSelectionLeaf() || &object == view.selectionData().selectionStart() || &object == view.selectionData().selectionEnd()) && object.selectionState() != RenderObject::SelectionNone && object.containingBlock();
    824 }
    825 
    826 void RenderView::clearSubtreeSelection(SelectionRepaintMode blockRepaintMode, OldSelectionData& oldSelectionData) const
    827 {
    828     // Record the old selected objects.  These will be used later
    829     // when we compare against the new selected objects.
    830     oldSelectionData.selectionStartPos = selectionData().selectionStartPos();
    831     oldSelectionData.selectionEndPos = selectionData().selectionEndPos();
    832    
    833     // Blocks contain selected objects and fill gaps between them, either on the left, right, or in between lines and blocks.
    834     // In order to get the repaint rect right, we have to examine left, middle, and right rects individually, since otherwise
    835     // the union of those rects might remain the same even when changes have occurred.
    836 
    837     RenderObject* os = selectionData().selectionStart();
    838     auto* selectionEnd = selectionData().selectionEnd();
    839     RenderObject* stop = nullptr;
    840     if (selectionEnd)
    841         stop = rendererAfterPosition(selectionEnd, selectionData().selectionEndPos().value());
    842     SelectionIterator selectionIterator(os);
    843     while (os && os != stop) {
    844         if (isValidObjectForNewSelection(*this, *os)) {
    845             // Blocks are responsible for painting line gaps and margin gaps.  They must be examined as well.
    846             oldSelectionData.selectedObjects.set(os, std::make_unique<RenderSelectionInfo>(*os, true));
    847             if (blockRepaintMode == RepaintNewXOROld) {
    848                 RenderBlock* cb = os->containingBlock();
    849                 while (cb && !is<RenderView>(*cb)) {
    850                     std::unique_ptr<RenderBlockSelectionInfo>& blockInfo = oldSelectionData.selectedBlocks.add(cb, nullptr).iterator->value;
    851                     if (blockInfo)
    852                         break;
    853                     blockInfo = std::make_unique<RenderBlockSelectionInfo>(*cb);
    854                     cb = cb->containingBlock();
    855                 }
    856             }
    857         }
    858 
    859         os = selectionIterator.next();
    860     }
    861 
    862     for (auto* selectedObject : oldSelectionData.selectedObjects.keys())
    863         selectedObject->setSelectionStateIfNeeded(SelectionNone);
    864 }
    865 
    866 void RenderView::applySubtreeSelection(SelectionRepaintMode blockRepaintMode, const OldSelectionData& oldSelectionData)
    867 {
    868     // Update the selection status of all objects between selectionStart and selectionEnd
    869     if (selectionData().selectionStart() && selectionData().selectionStart() == selectionData().selectionEnd())
    870         selectionData().selectionStart()->setSelectionStateIfNeeded(SelectionBoth);
    871     else {
    872         if (selectionData().selectionStart())
    873             selectionData().selectionStart()->setSelectionStateIfNeeded(SelectionStart);
    874         if (selectionData().selectionEnd())
    875             selectionData().selectionEnd()->setSelectionStateIfNeeded(SelectionEnd);
    876     }
    877 
    878     RenderObject* selectionStart = selectionData().selectionStart();
    879     auto* selectionDataEnd = selectionData().selectionEnd();
    880     RenderObject* selectionEnd = nullptr;
    881     if (selectionDataEnd)
    882         selectionEnd = rendererAfterPosition(selectionDataEnd, selectionData().selectionEndPos().value());
    883     SelectionIterator selectionIterator(selectionStart);
    884     for (RenderObject* currentRenderer = selectionStart; currentRenderer && currentRenderer != selectionEnd; currentRenderer = selectionIterator.next()) {
    885         if (currentRenderer == selectionData().selectionStart() || currentRenderer == selectionData().selectionEnd())
    886             continue;
    887         if (!currentRenderer->canBeSelectionLeaf())
    888             continue;
    889         currentRenderer->setSelectionStateIfNeeded(SelectionInside);
    890     }
    891 
    892     if (blockRepaintMode != RepaintNothing)
    893         layer()->clearBlockSelectionGapsBounds();
    894 
    895     // Now that the selection state has been updated for the new objects, walk them again and
    896     // put them in the new objects list.
    897     SelectedObjectMap newSelectedObjects;
    898     SelectedBlockMap newSelectedBlocks;
    899     selectionIterator = SelectionIterator(selectionStart);
    900     for (RenderObject* currentRenderer = selectionStart; currentRenderer && currentRenderer != selectionEnd; currentRenderer = selectionIterator.next()) {
    901         if (isValidObjectForNewSelection(*this, *currentRenderer)) {
    902             std::unique_ptr<RenderSelectionInfo> selectionInfo = std::make_unique<RenderSelectionInfo>(*currentRenderer, true);
    903 
    904 #if ENABLE(SERVICE_CONTROLS)
    905             for (auto& rect : selectionInfo->collectedSelectionRects())
    906                 m_selectionRectGatherer.addRect(selectionInfo->repaintContainer(), rect);
    907             if (!currentRenderer->isTextOrLineBreak())
    908                 m_selectionRectGatherer.setTextOnly(false);
    909 #endif
    910 
    911             newSelectedObjects.set(currentRenderer, WTFMove(selectionInfo));
    912 
    913             RenderBlock* containingBlock = currentRenderer->containingBlock();
    914             while (containingBlock && !is<RenderView>(*containingBlock)) {
    915                 std::unique_ptr<RenderBlockSelectionInfo>& blockInfo = newSelectedBlocks.add(containingBlock, nullptr).iterator->value;
    916                 if (blockInfo)
    917                     break;
    918                 blockInfo = std::make_unique<RenderBlockSelectionInfo>(*containingBlock);
    919                 containingBlock = containingBlock->containingBlock();
    920 
    921 #if ENABLE(SERVICE_CONTROLS)
    922                 m_selectionRectGatherer.addGapRects(blockInfo->repaintContainer(), blockInfo->rects());
    923 #endif
    924             }
    925         }
    926     }
    927 
    928     if (blockRepaintMode == RepaintNothing)
    929         return;
    930 
    931     // Have any of the old selected objects changed compared to the new selection?
    932     for (const auto& selectedObjectInfo : oldSelectionData.selectedObjects) {
    933         RenderObject* obj = selectedObjectInfo.key;
    934         RenderSelectionInfo* newInfo = newSelectedObjects.get(obj);
    935         RenderSelectionInfo* oldInfo = selectedObjectInfo.value.get();
    936         if (!newInfo || oldInfo->rect() != newInfo->rect() || oldInfo->state() != newInfo->state()
    937             || (selectionData().selectionStart() == obj && oldSelectionData.selectionStartPos != selectionData().selectionStartPos())
    938             || (selectionData().selectionEnd() == obj && oldSelectionData.selectionEndPos != selectionData().selectionEndPos())) {
    939             oldInfo->repaint();
    940             if (newInfo) {
    941                 newInfo->repaint();
    942                 newSelectedObjects.remove(obj);
    943             }
    944         }
    945     }
    946 
    947     // Any new objects that remain were not found in the old objects dict, and so they need to be updated.
    948     for (const auto& selectedObjectInfo : newSelectedObjects)
    949         selectedObjectInfo.value->repaint();
    950 
    951     // Have any of the old blocks changed?
    952     for (const auto& selectedBlockInfo : oldSelectionData.selectedBlocks) {
    953         const RenderBlock* block = selectedBlockInfo.key;
    954         RenderBlockSelectionInfo* newInfo = newSelectedBlocks.get(block);
    955         RenderBlockSelectionInfo* oldInfo = selectedBlockInfo.value.get();
    956         if (!newInfo || oldInfo->rects() != newInfo->rects() || oldInfo->state() != newInfo->state()) {
    957             oldInfo->repaint();
    958             if (newInfo) {
    959                 newInfo->repaint();
    960                 newSelectedBlocks.remove(block);
    961             }
    962         }
    963     }
    964 
    965     // Any new blocks that remain were not found in the old blocks dict, and so they need to be updated.
    966     for (const auto& selectedBlockInfo : newSelectedBlocks)
    967         selectedBlockInfo.value->repaint();
    968 }
    969 
    970 void RenderView::getSelection(RenderObject*& startRenderer, std::optional<unsigned>& startOffset, RenderObject*& endRenderer, std::optional<unsigned>& endOffset) const
    971 {
    972     startRenderer = m_selectionUnsplitStart;
    973     startOffset = m_selectionUnsplitStartPos;
    974     endRenderer = m_selectionUnsplitEnd;
    975     endOffset = m_selectionUnsplitEndPos;
    976 }
    977 
    978 void RenderView::clearSelection()
    979 {
    980     layer()->repaintBlockSelectionGaps();
    981     setSelection(nullptr, std::nullopt, nullptr, std::nullopt, RepaintNewMinusOld);
    982 }
    983 
    984656bool RenderView::printing() const
    985657{
  • trunk/Source/WebCore/rendering/RenderView.h

    r222677 r222697  
    2727#include "RenderBlockFlow.h"
    2828#include "RenderWidget.h"
    29 #include "SelectionSubtreeRoot.h"
     29#include "SelectionRangeData.h"
    3030#include <memory>
    3131#include <wtf/HashSet.h>
    3232#include <wtf/ListHashSet.h>
    3333
    34 #if ENABLE(SERVICE_CONTROLS)
    35 #include "SelectionRectGatherer.h"
    36 #endif
    37 
    3834namespace WebCore {
    3935
     
    4238class RenderQuote;
    4339
    44 class RenderView final : public RenderBlockFlow, public SelectionSubtreeRoot {
     40class RenderView final : public RenderBlockFlow {
    4541public:
    4642    RenderView(Document&, RenderStyle&&);
     
    8682    RenderElement* rendererForRootBackground() const;
    8783
    88     enum SelectionRepaintMode { RepaintNewXOROld, RepaintNewMinusOld, RepaintNothing };
    89     void setSelection(RenderObject* start, std::optional<unsigned> startPos, RenderObject* endObject, std::optional<unsigned> endPos, SelectionRepaintMode = RepaintNewXOROld);
    90     void getSelection(RenderObject*& startRenderer, std::optional<unsigned>& startOffset, RenderObject*& endRenderer, std::optional<unsigned>& endOffset) const;
    91     void clearSelection();
    92     RenderObject* selectionUnsplitStart() const { return m_selectionUnsplitStart; }
    93     RenderObject* selectionUnsplitEnd() const { return m_selectionUnsplitEnd; }
    94     IntRect selectionBounds(bool clipToVisibleContent = true) const;
    95     void repaintSelection() const;
    96     void getSelectionStartEnd(unsigned& start, unsigned& end) const { selectionData().selectionStartEndPositions(start, end); }
     84    SelectionRangeData& selection() { return m_selection; }
    9785
    9886    bool printing() const;
     
    313301    bool isScrollableOrRubberbandableBox() const override;
    314302
    315     void clearSubtreeSelection(SelectionRepaintMode blockRepaintMode, OldSelectionData&) const;
    316     void applySubtreeSelection(SelectionRepaintMode, const OldSelectionData&);
    317     LayoutRect subtreeSelectionBounds(bool clipToVisibleContent = true) const;
    318     void repaintSubtreeSelection() const;
    319 
    320303private:
    321304    FrameView& m_frameView;
    322305
    323     RenderObject* m_selectionUnsplitStart { nullptr };
    324     RenderObject* m_selectionUnsplitEnd { nullptr };
    325     std::optional<unsigned> m_selectionUnsplitStartPos;
    326     std::optional<unsigned> m_selectionUnsplitEndPos;
    327 
    328306    // Include this RenderView.
    329307    uint64_t m_rendererCount { 1 };
    330308
    331309    mutable std::unique_ptr<Region> m_accumulatedRepaintRegion;
     310    SelectionRangeData m_selection;
    332311
    333312    // FIXME: Only used by embedded WebViews inside AppKit NSViews.  Find a way to remove.
     
    361340    unsigned m_renderTreeInternalMutationCounter { 0 };
    362341
    363     bool m_selectionWasCaret { false };
    364342    bool m_hasSoftwareFilters { false };
    365343    bool m_usesFirstLineRules { false };
     
    373351    Vector<RefPtr<RenderWidget>> m_protectedRenderWidgets;
    374352
    375 #if ENABLE(SERVICE_CONTROLS)
    376     SelectionRectGatherer m_selectionRectGatherer;
    377 #endif
    378353#if ENABLE(CSS_SCROLL_SNAP)
    379354    HashSet<const RenderBox*> m_boxesWithScrollSnapPositions;
  • trunk/Source/WebCore/rendering/RenderingAllInOne.cpp

    r222575 r222697  
    134134#include "RootInlineBox.cpp"
    135135#include "ScrollAlignment.cpp"
    136 #include "SelectionSubtreeRoot.cpp"
     136#include "SelectionRangeData.cpp"
    137137#include "SimpleLineLayout.cpp"
    138138#include "SimpleLineLayoutCoverage.cpp"
Note: See TracChangeset for help on using the changeset viewer.