| Index: third_party/WebKit/Source/core/editing/LayoutSelection.h
|
| diff --git a/third_party/WebKit/Source/core/editing/LayoutSelection.h b/third_party/WebKit/Source/core/editing/LayoutSelection.h
|
| index 272d016a9fab7f6db869dfee5159145c5c935ff4..33fea24f5b6c143560056331b43e67f2d287230c 100644
|
| --- a/third_party/WebKit/Source/core/editing/LayoutSelection.h
|
| +++ b/third_party/WebKit/Source/core/editing/LayoutSelection.h
|
| @@ -24,11 +24,14 @@
|
|
|
| #include "core/editing/Position.h"
|
| #include "core/editing/VisibleSelection.h"
|
| +#include "core/layout/LayoutText.h"
|
| +
|
| #include "platform/heap/Handle.h"
|
|
|
| namespace blink {
|
|
|
| class FrameSelection;
|
| +class LayoutNGBlockFlow;
|
|
|
| // This class represents a selection range in layout tree for painting and
|
| // paint invalidation.
|
| @@ -40,28 +43,54 @@ class FrameSelection;
|
| // editing/ passes them as offsets in the DOM tree but layout uses them as
|
| // offset in the layout tree. This doesn't work in the cases of
|
| // CSS first-letter or character transform. See crbug.com/17528.
|
| -class SelectionPaintRange {
|
| - DISALLOW_NEW();
|
| -
|
| +class SelectionPaintRange : public GarbageCollected<SelectionPaintRange> {
|
| public:
|
| - SelectionPaintRange() = default;
|
| + SelectionPaintRange() = delete;
|
| SelectionPaintRange(LayoutObject* start_layout_object,
|
| int start_offset,
|
| LayoutObject* end_layout_object,
|
| int end_offset);
|
| + SelectionPaintRange(Node* start_node,
|
| + LayoutObject* start_layout_object,
|
| + int start_offset,
|
| + Node* end_node,
|
| + LayoutObject* end_layout_object,
|
| + int end_offset)
|
| + : SelectionPaintRange(start_layout_object,
|
| + start_offset,
|
| + end_layout_object,
|
| + end_offset) {
|
| + start_node_ = start_node;
|
| + end_node_ = end_node;
|
| + }
|
| + SelectionPaintRange(const SelectionPaintRange& other)
|
| + : start_node_(other.start_node_),
|
| + start_layout_object_(other.start_layout_object_),
|
| + start_offset_(other.start_offset_),
|
| + end_node_(other.end_node_),
|
| + end_layout_object_(other.end_layout_object_),
|
| + end_offset_(other.end_offset_) {}
|
|
|
| bool operator==(const SelectionPaintRange& other) const;
|
|
|
| + Node* StartNode() const { return start_node_; }
|
| LayoutObject* StartLayoutObject() const;
|
| int StartOffset() const;
|
| + Node* EndNode() const { return end_node_; }
|
| LayoutObject* EndLayoutObject() const;
|
| int EndOffset() const;
|
|
|
| - bool IsNull() const { return !start_layout_object_; }
|
| + DEFINE_INLINE_TRACE() {
|
| + visitor->Trace(start_node_);
|
| + visitor->Trace(end_node_);
|
| + }
|
|
|
| private:
|
| + // TODO(yoichio): start/end_node_ is only used if *_layout_object_ is NG.
|
| + Member<Node> start_node_;
|
| LayoutObject* start_layout_object_ = nullptr;
|
| int start_offset_ = -1;
|
| + Member<Node> end_node_;
|
| LayoutObject* end_layout_object_ = nullptr;
|
| int end_offset_ = -1;
|
| };
|
| @@ -80,6 +109,12 @@ class LayoutSelection final : public GarbageCollected<LayoutSelection> {
|
| void InvalidatePaintForSelection();
|
|
|
| void ClearSelection();
|
| + // TODO(yoichio): Returns pair<Union<NGOffset, DOMOffset>, Union<NGOffset,
|
| + // DOMOffset>>. Content of the Union is decided by if
|
| + // paint_range_.Start(End)LayoutObject() is NG or not. LayoutObject painter
|
| + // calliing this should know if the LayoutObject is NG and
|
| + // LayoutObject.SelectionState because SelectionStartEnd().first doesn't make
|
| + // sense for SelectionState::kEnd LayoutObject.
|
| std::pair<int, int> SelectionStartEnd();
|
| void OnDocumentShutdown();
|
|
|
| @@ -91,7 +126,41 @@ class LayoutSelection final : public GarbageCollected<LayoutSelection> {
|
| Member<FrameSelection> frame_selection_;
|
| bool has_pending_selection_ : 1;
|
|
|
| - SelectionPaintRange paint_range_;
|
| + Member<SelectionPaintRange> paint_range_;
|
| +};
|
| +
|
| +class CORE_EXPORT NGTextOffsetMap : public GarbageCollected<NGTextOffsetMap> {
|
| + public:
|
| + class Builder;
|
| + NGTextOffsetMap() = default;
|
| + NGTextOffsetMap(const NGTextOffsetMap&& other) {
|
| + node_to_offset_map_ = std::move(other.node_to_offset_map_);
|
| + }
|
| +
|
| + static NGTextOffsetMap Create(const LayoutNGBlockFlow&);
|
| +
|
| + Optional<int> Get(Node*, int) const;
|
| +
|
| + DEFINE_INLINE_TRACE() { visitor->Trace(node_to_offset_map_); }
|
| +
|
| + private:
|
| + HeapHashMap<std::pair<WeakMember<Node>, int>, int> node_to_offset_map_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(NGTextOffsetMap);
|
| +};
|
| +
|
| +class CORE_EXPORT NGTextOffsetMap::Builder {
|
| + STACK_ALLOCATED();
|
| +
|
| + public:
|
| + explicit Builder();
|
| + void Add(Node*, int dom_offset, int layout_offset);
|
| + NGTextOffsetMap Build();
|
| +
|
| + private:
|
| + Member<NGTextOffsetMap> offset_map_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Builder);
|
| };
|
|
|
| } // namespace blink
|
|
|