Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(689)

Unified Diff: third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp

Issue 2820633002: [DMC #2] Add DocumentMarkerList interface and GenericDocumentMarkerListImpl (Closed)
Patch Set: Rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
index 6452faed57ae10e0e86a7a49d91cdae44bf18a47..f590364b49a8f2ed3c93fc8eff7986323d8cc832 100644
--- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
+++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
@@ -35,6 +35,7 @@
#include "core/dom/Text.h"
#include "core/editing/iterators/TextIterator.h"
#include "core/editing/markers/DocumentMarkerListEditor.h"
+#include "core/editing/markers/GenericDocumentMarkerListImpl.h"
#include "core/editing/markers/RenderedDocumentMarker.h"
#include "core/frame/FrameView.h"
#include "core/layout/LayoutObject.h"
@@ -78,9 +79,9 @@ DocumentMarker::MarkerTypeIndex MarkerTypeToMarkerIndex(
} // namespace
-Member<DocumentMarkerController::MarkerList>&
-DocumentMarkerController::ListForType(MarkerLists* marker_lists,
- DocumentMarker::MarkerType type) {
+Member<DocumentMarkerList>& DocumentMarkerController::ListForType(
+ MarkerLists* marker_lists,
+ DocumentMarker::MarkerType type) {
const size_t marker_list_index = MarkerTypeToMarkerIndex(type);
return (*marker_lists)[marker_list_index];
}
@@ -108,10 +109,10 @@ void DocumentMarkerController::AddMarker(const Position& start,
// covers.
for (TextIterator marked_text(start, end); !marked_text.AtEnd();
marked_text.Advance()) {
- AddMarker(
- marked_text.CurrentContainer(),
- DocumentMarker(type, marked_text.StartOffsetInCurrentContainer(),
- marked_text.EndOffsetInCurrentContainer(), description));
+ AddMarker(marked_text.CurrentContainer(),
+ new DocumentMarker(
+ type, marked_text.StartOffsetInCurrentContainer(),
+ marked_text.EndOffsetInCurrentContainer(), description));
}
}
@@ -125,9 +126,9 @@ void DocumentMarkerController::AddTextMatchMarker(
for (TextIterator marked_text(range.StartPosition(), range.EndPosition());
!marked_text.AtEnd(); marked_text.Advance()) {
AddMarker(marked_text.CurrentContainer(),
- DocumentMarker(marked_text.StartOffsetInCurrentContainer(),
- marked_text.EndOffsetInCurrentContainer(),
- match_status));
+ new DocumentMarker(marked_text.StartOffsetInCurrentContainer(),
+ marked_text.EndOffsetInCurrentContainer(),
+ match_status));
}
// Don't invalidate tickmarks here. TextFinder invalidates tickmarks using a
// throttling algorithm. crbug.com/6819.
@@ -141,11 +142,12 @@ void DocumentMarkerController::AddCompositionMarker(const Position& start,
DCHECK(!document_->NeedsLayoutTreeUpdate());
for (TextIterator marked_text(start, end); !marked_text.AtEnd();
- marked_text.Advance())
+ marked_text.Advance()) {
AddMarker(marked_text.CurrentContainer(),
- DocumentMarker(marked_text.StartOffsetInCurrentContainer(),
- marked_text.EndOffsetInCurrentContainer(),
- underline_color, thick, background_color));
+ new DocumentMarker(marked_text.StartOffsetInCurrentContainer(),
+ marked_text.EndOffsetInCurrentContainer(),
+ underline_color, thick, background_color));
+ }
}
void DocumentMarkerController::PrepareForDestruction() {
@@ -206,12 +208,12 @@ static void UpdateMarkerRenderedRect(const Node& node,
// Markers of the same type do not overlap each other.
void DocumentMarkerController::AddMarker(Node* node,
- const DocumentMarker& new_marker) {
- DCHECK_GE(new_marker.EndOffset(), new_marker.StartOffset());
- if (new_marker.EndOffset() == new_marker.StartOffset())
+ DocumentMarker* new_marker) {
+ DCHECK_GE(new_marker->EndOffset(), new_marker->StartOffset());
+ if (new_marker->EndOffset() == new_marker->StartOffset())
return;
- possibly_existing_marker_types_.Add(new_marker.GetType());
+ possibly_existing_marker_types_.Add(new_marker->GetType());
Member<MarkerLists>& markers =
markers_.insert(node, nullptr).stored_value->value;
@@ -220,12 +222,12 @@ void DocumentMarkerController::AddMarker(Node* node,
markers->Grow(DocumentMarker::kMarkerTypeIndexesCount);
}
- const DocumentMarker::MarkerType new_marker_type = new_marker.GetType();
+ const DocumentMarker::MarkerType new_marker_type = new_marker->GetType();
if (!ListForType(markers, new_marker_type))
- ListForType(markers, new_marker_type) = new MarkerList;
+ ListForType(markers, new_marker_type) = new GenericDocumentMarkerListImpl;
- Member<MarkerList>& list = ListForType(markers, new_marker_type);
- DocumentMarkerListEditor::AddMarker(list, &new_marker);
+ Member<DocumentMarkerList>& list = ListForType(markers, new_marker_type);
+ list->Add(new_marker);
// repaint the affected node
if (node->GetLayoutObject()) {
@@ -259,15 +261,14 @@ void DocumentMarkerController::MoveMarkers(Node* src_node,
bool doc_dirty = false;
for (size_t marker_list_index = 0; marker_list_index < src_markers->size();
++marker_list_index) {
- MarkerList* src_list = src_markers->at(marker_list_index);
+ DocumentMarkerList* src_list = src_markers->at(marker_list_index);
if (!src_list)
continue;
if (!dst_markers->at(marker_list_index))
- dst_markers->at(marker_list_index) = new MarkerList;
- MarkerList* dst_list = dst_markers->at(marker_list_index);
+ dst_markers->at(marker_list_index) = new GenericDocumentMarkerListImpl;
- if (DocumentMarkerListEditor::MoveMarkers(src_list, length, dst_list))
+ if (src_list->MoveMarkers(length, dst_markers->at(marker_list_index)))
doc_dirty = true;
}
@@ -296,24 +297,23 @@ void DocumentMarkerController::RemoveMarkers(
bool doc_dirty = false;
size_t empty_lists_count = 0;
- for (size_t marker_list_index = 0;
- marker_list_index < DocumentMarker::kMarkerTypeIndexesCount;
- ++marker_list_index) {
- Member<MarkerList>& list = (*markers)[marker_list_index];
+ for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
+ size_t marker_list_index = MarkerTypeToMarkerIndex(type);
+ DocumentMarkerList* list = (*markers)[marker_list_index];
if (!list || list->IsEmpty()) {
- if (list.Get() && list->IsEmpty())
- list.Clear();
+ if (list && list->IsEmpty())
+ (*markers)[marker_list_index] = nullptr;
++empty_lists_count;
continue;
}
- if (!marker_types.Contains((*list->begin())->GetType()))
+ if (!marker_types.Contains(type))
continue;
- if (DocumentMarkerListEditor::RemoveMarkers(list, start_offset, length))
+ if (list->RemoveMarkers(start_offset, length))
doc_dirty = true;
if (list->IsEmpty()) {
- list.Clear();
+ (*markers)[marker_list_index] = nullptr;
++empty_lists_count;
}
}
@@ -340,16 +340,13 @@ DocumentMarkerVector DocumentMarkerController::MarkersFor(
if (!markers)
return result;
- for (size_t marker_list_index = 0;
- marker_list_index < DocumentMarker::kMarkerTypeIndexesCount;
- ++marker_list_index) {
- Member<MarkerList>& list = (*markers)[marker_list_index];
- if (!list || list->IsEmpty() ||
- !marker_types.Contains((*list->begin())->GetType()))
+ for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
+ size_t marker_list_index = MarkerTypeToMarkerIndex(type);
+ DocumentMarkerList* list = (*markers)[marker_list_index];
+ if (!list || list->IsEmpty() || !marker_types.Contains(type))
continue;
- for (size_t i = 0; i < list->size(); ++i)
- result.push_back(list->at(i).Get());
+ list->AppendMarkersToInputList(&result);
yosin_UTC9 2017/04/20 05:28:46 I prefer to have list->GetMarkers() -> Vector<Memb
}
std::sort(result.begin(), result.end(), CompareByStart);
@@ -363,9 +360,10 @@ DocumentMarkerVector DocumentMarkerController::Markers() {
for (size_t marker_list_index = 0;
marker_list_index < DocumentMarker::kMarkerTypeIndexesCount;
++marker_list_index) {
- Member<MarkerList>& list = (*markers)[marker_list_index];
- for (size_t j = 0; list.Get() && j < list->size(); ++j)
- result.push_back(list->at(j).Get());
+ DocumentMarkerList* list = (*markers)[marker_list_index];
+ if (!list)
+ continue;
+ list->AppendMarkersToInputList(&result);
}
}
std::sort(result.begin(), result.end(), CompareByStart);
@@ -420,20 +418,22 @@ Vector<IntRect> DocumentMarkerController::RenderedRectsForMarkers(
if (!node.isConnected())
continue;
MarkerLists* markers = node_iterator->value.Get();
- for (size_t marker_list_index = 0;
- marker_list_index < DocumentMarker::kMarkerTypeIndexesCount;
- ++marker_list_index) {
- Member<MarkerList>& list = (*markers)[marker_list_index];
- if (!list || list->IsEmpty() ||
- (*list->begin())->GetType() != marker_type)
+ for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
+ size_t marker_list_index = MarkerTypeToMarkerIndex(type);
+ DocumentMarkerList* list = (*markers)[marker_list_index];
+ if (!list || list->IsEmpty() || type != marker_type)
continue;
- for (unsigned marker_index = 0; marker_index < list->size();
- ++marker_index) {
- RenderedDocumentMarker* marker = list->at(marker_index).Get();
- UpdateMarkerRenderedRectIfNeeded(node, *marker);
- if (!marker->IsRendered())
+
+ DocumentMarkerVector markers_in_list;
+ list->AppendMarkersToInputList(&markers_in_list);
+
+ for (DocumentMarker* marker : markers_in_list) {
+ RenderedDocumentMarker* rendered_marker =
+ ToRenderedDocumentMarker(marker);
+ UpdateMarkerRenderedRectIfNeeded(node, *rendered_marker);
+ if (!rendered_marker->IsRendered())
continue;
- result.push_back(marker->RenderedRect());
+ result.push_back(rendered_marker->RenderedRect());
}
}
}
@@ -463,10 +463,12 @@ void DocumentMarkerController::InvalidateRectsForMarkersInNode(
if (!marker_list || marker_list->IsEmpty())
continue;
- for (auto& marker : *marker_list)
- marker->Invalidate();
+ DocumentMarkerVector markers_in_list;
+ marker_list->AppendMarkersToInputList(&markers_in_list);
+ for (auto& marker : markers_in_list)
+ ToRenderedDocumentMarker(marker)->Invalidate();
- if (marker_list->front()->GetType() == DocumentMarker::kTextMatch)
+ if (markers_in_list.front()->GetType() == DocumentMarker::kTextMatch)
InvalidatePaintForTickmarks(node);
}
}
@@ -478,10 +480,12 @@ void DocumentMarkerController::InvalidateRectsForAllMarkers() {
if (!marker_list || marker_list->IsEmpty())
continue;
- for (auto& marker : *marker_list)
- marker->Invalidate();
+ DocumentMarkerVector markers_in_list;
+ marker_list->AppendMarkersToInputList(&markers_in_list);
+ for (DocumentMarker* marker : markers_in_list)
+ ToRenderedDocumentMarker(marker)->Invalidate();
- if (marker_list->front()->GetType() == DocumentMarker::kTextMatch)
+ if (markers_in_list.front()->GetType() == DocumentMarker::kTextMatch)
InvalidatePaintForTickmarks(node);
}
}
@@ -515,17 +519,26 @@ void DocumentMarkerController::RemoveMarkers(
for (size_t marker_list_index = 0;
marker_list_index < DocumentMarker::kMarkerTypeIndexesCount;
++marker_list_index) {
- Member<MarkerList>& list = markers[marker_list_index];
+ DocumentMarkerList* list = markers[marker_list_index];
if (!list)
continue;
bool removed_markers = false;
- for (size_t j = list->size(); j > 0; --j) {
- if (should_remove_marker(*list->at(j - 1),
+
+ DocumentMarkerVector markers_in_list;
+ list->AppendMarkersToInputList(&markers_in_list);
+
+ for (size_t j = markers_in_list.size(); j > 0; --j) {
+ if (should_remove_marker(*markers_in_list[j - 1],
static_cast<const Text&>(node))) {
- list->erase(j - 1);
+ markers_in_list.erase(j - 1);
removed_markers = true;
}
}
+
+ list->Clear();
+ for (DocumentMarker* marker : markers_in_list)
+ list->Add(marker);
+
if (removed_markers &&
marker_list_index == DocumentMarker::kTextMatchMarkerIndex)
InvalidatePaintForTickmarks(node);
@@ -564,19 +577,18 @@ void DocumentMarkerController::RemoveMarkersFromList(
} else {
MarkerLists* markers = iterator->value.Get();
- for (size_t marker_list_index = 0;
- marker_list_index < DocumentMarker::kMarkerTypeIndexesCount;
- ++marker_list_index) {
- Member<MarkerList>& list = (*markers)[marker_list_index];
+ for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
+ size_t marker_list_index = MarkerTypeToMarkerIndex(type);
+ DocumentMarkerList* list = (*markers)[marker_list_index];
if (!list || list->IsEmpty()) {
- if (list.Get() && list->IsEmpty())
- list.Clear();
+ if (list && list->IsEmpty())
+ (*markers)[marker_list_index] = nullptr;
++empty_lists_count;
continue;
}
- if (marker_types.Contains((*list->begin())->GetType())) {
- list->clear();
- list.Clear();
+ if (marker_types.Contains(type)) {
+ list->Clear();
+ ListForType(markers, type) = nullptr;
++empty_lists_count;
needs_repainting = true;
}
@@ -615,12 +627,10 @@ void DocumentMarkerController::RepaintMarkers(
// inner loop: process each marker in the current node
MarkerLists* markers = i->value.Get();
- for (size_t marker_list_index = 0;
- marker_list_index < DocumentMarker::kMarkerTypeIndexesCount;
- ++marker_list_index) {
- Member<MarkerList>& list = (*markers)[marker_list_index];
- if (!list || list->IsEmpty() ||
- !marker_types.Contains((*list->begin())->GetType()))
+ for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) {
+ size_t marker_list_index = MarkerTypeToMarkerIndex(type);
+ DocumentMarkerList* list = (*markers)[marker_list_index];
+ if (!list || list->IsEmpty() || !marker_types.Contains(type))
continue;
// cause the node to be redrawn
@@ -668,13 +678,18 @@ bool DocumentMarkerController::SetMarkersActive(Node* node,
return false;
bool doc_dirty = false;
- Member<MarkerList>& list = ListForType(markers, DocumentMarker::kTextMatch);
+ DocumentMarkerList* list = ListForType(markers, DocumentMarker::kTextMatch);
+
if (!list)
return false;
- MarkerList::iterator start_pos = std::upper_bound(
- list->begin(), list->end(), start_offset, DocumentMarker::EndsBefore);
- for (MarkerList::iterator marker = start_pos; marker != list->end();
- ++marker) {
+
+ DocumentMarkerVector markers_in_list;
+ list->AppendMarkersToInputList(&markers_in_list);
+
+ const auto start_pos =
+ std::upper_bound(markers_in_list.begin(), markers_in_list.end(),
+ start_offset, DocumentMarker::EndsBefore);
+ for (auto marker = start_pos; marker != markers_in_list.end(); ++marker) {
// Markers are returned in order, so stop if we are now past the specified
// range.
if ((*marker)->StartOffset() >= end_offset)
@@ -704,10 +719,12 @@ void DocumentMarkerController::ShowMarkers() const {
for (size_t marker_list_index = 0;
marker_list_index < DocumentMarker::kMarkerTypeIndexesCount;
++marker_list_index) {
- Member<MarkerList>& list = (*markers)[marker_list_index];
- for (unsigned marker_index = 0; list.Get() && marker_index < list->size();
- ++marker_index) {
- DocumentMarker* marker = list->at(marker_index).Get();
+ DocumentMarkerList* list = (*markers)[marker_list_index];
+
+ DocumentMarkerVector markers_in_list;
+ list->AppendMarkersToInputList(&markers_in_list);
+
+ for (const DocumentMarker* marker : markers_in_list) {
builder.Append(" ");
builder.AppendNumber(marker->GetType());
builder.Append(":[");
@@ -740,12 +757,11 @@ void DocumentMarkerController::DidUpdateCharacterData(CharacterData* node,
return;
bool did_shift_marker = false;
- for (MarkerList* list : *markers) {
+ for (DocumentMarkerList* list : *markers) {
if (!list)
continue;
- if (DocumentMarkerListEditor::ShiftMarkers(list, offset, old_length,
- new_length))
+ if (list->ShiftMarkers(offset, old_length, new_length))
did_shift_marker = true;
}

Powered by Google App Engine
This is Rietveld 408576698