15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2000 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2000 Dirk Mueller (mueller@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef RenderSelectionInfo_h
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define RenderSelectionInfo_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderBox.h"
291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntRect.h"
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class RenderSelectionInfoBase : public NoBaseWillBeGarbageCollected<RenderSelectionInfoBase> {
34e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WTF_MAKE_NONCOPYABLE(RenderSelectionInfoBase); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderSelectionInfoBase()
37e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        : m_object(nullptr)
389e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        , m_paintInvalidationContainer(nullptr)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_state(RenderObject::SelectionNone)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderSelectionInfoBase(RenderObject* o)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_object(o)
457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        , m_paintInvalidationContainer(o->isRooted() ? o->containerForPaintInvalidation() : nullptr)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_state(o->selectionState())
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
50e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    void trace(Visitor* visitor)
51e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
52e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        visitor->trace(m_object);
539e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        visitor->trace(m_paintInvalidationContainer);
54e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
55e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* object() const { return m_object; }
579e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    const RenderLayerModelObject* paintInvalidationContainer() const { return m_paintInvalidationContainer; }
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject::SelectionState state() const { return m_state; }
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
61e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    RawPtrWillBeMember<RenderObject> m_object;
629e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    RawPtrWillBeMember<const RenderLayerModelObject> m_paintInvalidationContainer;
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject::SelectionState m_state;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This struct is used when the selection changes to cache the old and new state of the selection for each RenderObject.
67e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class RenderSelectionInfo FINAL : public RenderSelectionInfoBase {
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RenderSelectionInfo(RenderObject* o)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : RenderSelectionInfoBase(o)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_paintInvalidationContainer && o->canUpdateSelectionOnRootLineBoxes()) {
737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_rect = o->selectionRectForPaintInvalidation(m_paintInvalidationContainer);
745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            // FIXME: groupedMapping() leaks the squashing abstraction. See RenderBlockSelectionInfo for more details.
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (m_paintInvalidationContainer->layer()->groupedMapping())
767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                RenderLayer::mapRectToPaintBackingCoordinates(m_paintInvalidationContainer, m_rect);
775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        } else {
785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            m_rect = LayoutRect();
795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    void invalidatePaint()
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
849e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_object->invalidatePaintUsingContainer(m_paintInvalidationContainer, enclosingIntRect(m_rect), InvalidationSelection);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect rect() const { return m_rect; }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
909e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    LayoutRect m_rect; // relative to paint invalidation container
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This struct is used when the selection changes to cache the old and new state of the selection for each RenderBlock.
94e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class RenderBlockSelectionInfo FINAL : public RenderSelectionInfoBase {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBlockSelectionInfo(RenderBlock* b)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : RenderSelectionInfoBase(b)
9802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_paintInvalidationContainer && b->canUpdateSelectionOnRootLineBoxes())
1009e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            m_rects = block()->selectionGapRectsForPaintInvalidation(m_paintInvalidationContainer);
1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        else
1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            m_rects = GapRects();
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1059e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    void invalidatePaint()
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1079e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        LayoutRect paintInvalidationRect = m_rects;
1085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // FIXME: this is leaking the squashing abstraction. However, removing the groupedMapping() condiitional causes
109197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // RenderBox::mapRectToPaintInvalidationBacking to get called, which makes rect adjustments even if you pass the same
1109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        // paintInvalidationContainer as the render object. Find out why it does that and fix.
1119e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (m_paintInvalidationContainer && m_paintInvalidationContainer->layer()->groupedMapping())
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            RenderLayer::mapRectToPaintBackingCoordinates(m_paintInvalidationContainer, paintInvalidationRect);
1139e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_object->invalidatePaintUsingContainer(m_paintInvalidationContainer, enclosingIntRect(paintInvalidationRect), InvalidationSelection);
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBlock* block() const { return toRenderBlock(m_object); }
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GapRects rects() const { return m_rects; }
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1209e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    GapRects m_rects; // relative to paint invalidation container
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // RenderSelectionInfo_h
127