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

Side by Side Diff: Source/core/dom/DocumentMarkerController.cpp

Issue 289323003: Move markerlists to Oilpan heap and remove finalizer from DocumentMarkerController (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Move DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED Created 6 years, 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/dom/DocumentMarkerController.h ('k') | Source/core/dom/RenderedDocumentMarker.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
8 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 8 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 inline bool DocumentMarkerController::possiblyHasMarkers(DocumentMarker::MarkerT ypes types) 64 inline bool DocumentMarkerController::possiblyHasMarkers(DocumentMarker::MarkerT ypes types)
65 { 65 {
66 return m_possiblyExistingMarkerTypes.intersects(types); 66 return m_possiblyExistingMarkerTypes.intersects(types);
67 } 67 }
68 68
69 DocumentMarkerController::DocumentMarkerController() 69 DocumentMarkerController::DocumentMarkerController()
70 : m_possiblyExistingMarkerTypes(0) 70 : m_possiblyExistingMarkerTypes(0)
71 { 71 {
72 } 72 }
73 73
74 DocumentMarkerController::~DocumentMarkerController() 74 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(DocumentMarkerController);
75 {
76 }
77 75
78 void DocumentMarkerController::clear() 76 void DocumentMarkerController::clear()
79 { 77 {
80 m_markers.clear(); 78 m_markers.clear();
81 m_possiblyExistingMarkerTypes = 0; 79 m_possiblyExistingMarkerTypes = 0;
82 } 80 }
83 81
84 void DocumentMarkerController::addMarker(Range* range, DocumentMarker::MarkerTyp e type, const String& description, uint32_t hash) 82 void DocumentMarkerController::addMarker(Range* range, DocumentMarker::MarkerTyp e type, const String& description, uint32_t hash)
85 { 83 {
86 // Use a TextIterator to visit the potentially multiple nodes the range cove rs. 84 // Use a TextIterator to visit the potentially multiple nodes the range cove rs.
(...skipping 29 matching lines...) Expand all
116 RefPtrWillBeRawPtr<Range> textPiece = markedText.range(); 114 RefPtrWillBeRawPtr<Range> textPiece = markedText.range();
117 unsigned startOffset = textPiece->startOffset(); 115 unsigned startOffset = textPiece->startOffset();
118 unsigned endOffset = textPiece->endOffset(); 116 unsigned endOffset = textPiece->endOffset();
119 addMarker(textPiece->startContainer(), DocumentMarker(startOffset, endOf fset, activeMatch)); 117 addMarker(textPiece->startContainer(), DocumentMarker(startOffset, endOf fset, activeMatch));
120 if (endOffset > startOffset) { 118 if (endOffset > startOffset) {
121 // Rendered rects for markers in WebKit are not populated until each time 119 // Rendered rects for markers in WebKit are not populated until each time
122 // the markers are painted. However, we need it to happen sooner, be cause 120 // the markers are painted. However, we need it to happen sooner, be cause
123 // the whole purpose of tickmarks on the scrollbar is to show where 121 // the whole purpose of tickmarks on the scrollbar is to show where
124 // matches off-screen are (that haven't been painted yet). 122 // matches off-screen are (that haven't been painted yet).
125 Node* node = textPiece->startContainer(); 123 Node* node = textPiece->startContainer();
126 Vector<DocumentMarker*> markers = markersFor(node); 124 WillBeHeapVector<DocumentMarker*> markers = markersFor(node);
127 toRenderedDocumentMarker(markers[markers.size() - 1])->setRenderedRe ct(range->boundingBox()); 125 toRenderedDocumentMarker(markers[markers.size() - 1])->setRenderedRe ct(range->boundingBox());
128 } 126 }
129 } 127 }
130 } 128 }
131 129
132 void DocumentMarkerController::prepareForDestruction() 130 void DocumentMarkerController::prepareForDestruction()
133 { 131 {
134 clear(); 132 clear();
135 } 133 }
136 134
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 // Markers of the same type do not overlap each other. 180 // Markers of the same type do not overlap each other.
183 181
184 void DocumentMarkerController::addMarker(Node* node, const DocumentMarker& newMa rker) 182 void DocumentMarkerController::addMarker(Node* node, const DocumentMarker& newMa rker)
185 { 183 {
186 ASSERT(newMarker.endOffset() >= newMarker.startOffset()); 184 ASSERT(newMarker.endOffset() >= newMarker.startOffset());
187 if (newMarker.endOffset() == newMarker.startOffset()) 185 if (newMarker.endOffset() == newMarker.startOffset())
188 return; 186 return;
189 187
190 m_possiblyExistingMarkerTypes.add(newMarker.type()); 188 m_possiblyExistingMarkerTypes.add(newMarker.type());
191 189
192 OwnPtr<MarkerLists>& markers = m_markers.add(node, nullptr).storedValue->val ue; 190 OwnPtrWillBeMember<MarkerLists>& markers = m_markers.add(node, nullptr).stor edValue->value;
193 if (!markers) { 191 if (!markers) {
194 markers = adoptPtr(new MarkerLists); 192 markers = adoptPtrWillBeNoop(new MarkerLists);
195 markers->grow(DocumentMarker::MarkerTypeIndexesCount); 193 markers->grow(DocumentMarker::MarkerTypeIndexesCount);
196 } 194 }
197 195
198 DocumentMarker::MarkerTypeIndex markerListIndex = MarkerTypeToMarkerIndex(ne wMarker.type()); 196 DocumentMarker::MarkerTypeIndex markerListIndex = MarkerTypeToMarkerIndex(ne wMarker.type());
199 if (!markers->at(markerListIndex)) { 197 if (!markers->at(markerListIndex)) {
200 markers->insert(markerListIndex, adoptPtr(new MarkerList)); 198 markers->insert(markerListIndex, adoptPtrWillBeNoop(new MarkerList));
201 } 199 }
202 200
203 OwnPtr<MarkerList>& list = markers->at(markerListIndex); 201 OwnPtrWillBeMember<MarkerList>& list = markers->at(markerListIndex);
204 if (list->isEmpty() || list->last().endOffset() < newMarker.startOffset()) { 202 if (list->isEmpty() || list->last().endOffset() < newMarker.startOffset()) {
205 list->append(RenderedDocumentMarker(newMarker)); 203 list->append(RenderedDocumentMarker(newMarker));
206 } else { 204 } else {
207 RenderedDocumentMarker toInsert(newMarker); 205 RenderedDocumentMarker toInsert(newMarker);
208 if (toInsert.type() != DocumentMarker::TextMatch) { 206 if (toInsert.type() != DocumentMarker::TextMatch) {
209 mergeOverlapping(list.get(), toInsert); 207 mergeOverlapping(list.get(), toInsert);
210 } else { 208 } else {
211 MarkerList::iterator pos = std::lower_bound(list->begin(), list->end (), toInsert, startsFurther); 209 MarkerList::iterator pos = std::lower_bound(list->begin(), list->end (), toInsert, startsFurther);
212 list->insert(pos - list->begin(), RenderedDocumentMarker(toInsert)); 210 list->insert(pos - list->begin(), RenderedDocumentMarker(toInsert));
213 } 211 }
(...skipping 28 matching lines...) Expand all
242 if (!possiblyHasMarkers(DocumentMarker::AllMarkers())) 240 if (!possiblyHasMarkers(DocumentMarker::AllMarkers()))
243 return; 241 return;
244 ASSERT(!m_markers.isEmpty()); 242 ASSERT(!m_markers.isEmpty());
245 243
246 MarkerLists* markers = m_markers.get(srcNode); 244 MarkerLists* markers = m_markers.get(srcNode);
247 if (!markers) 245 if (!markers)
248 return; 246 return;
249 247
250 bool docDirty = false; 248 bool docDirty = false;
251 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp eIndexesCount; ++markerListIndex) { 249 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp eIndexesCount; ++markerListIndex) {
252 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; 250 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex];
253 if (!list) 251 if (!list)
254 continue; 252 continue;
255 253
256 unsigned endOffset = startOffset + length - 1; 254 unsigned endOffset = startOffset + length - 1;
257 MarkerList::iterator startPos = std::lower_bound(list->begin(), list->en d(), startOffset, doesNotInclude); 255 MarkerList::iterator startPos = std::lower_bound(list->begin(), list->en d(), startOffset, doesNotInclude);
258 for (MarkerList::iterator i = startPos; i != list->end(); ++i) { 256 for (MarkerList::iterator i = startPos; i != list->end(); ++i) {
259 DocumentMarker marker = *i; 257 DocumentMarker marker = *i;
260 258
261 // stop if we are now past the specified range 259 // stop if we are now past the specified range
262 if (marker.startOffset() > endOffset) 260 if (marker.startOffset() > endOffset)
(...skipping 25 matching lines...) Expand all
288 return; 286 return;
289 ASSERT(!(m_markers.isEmpty())); 287 ASSERT(!(m_markers.isEmpty()));
290 288
291 MarkerLists* markers = m_markers.get(node); 289 MarkerLists* markers = m_markers.get(node);
292 if (!markers) 290 if (!markers)
293 return; 291 return;
294 292
295 bool docDirty = false; 293 bool docDirty = false;
296 size_t emptyListsCount = 0; 294 size_t emptyListsCount = 0;
297 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp eIndexesCount; ++markerListIndex) { 295 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp eIndexesCount; ++markerListIndex) {
298 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; 296 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex];
299 if (!list || list->isEmpty()) { 297 if (!list || list->isEmpty()) {
300 if (list.get() && list->isEmpty()) 298 if (list.get() && list->isEmpty())
301 list.clear(); 299 list.clear();
302 ++emptyListsCount; 300 ++emptyListsCount;
303 continue; 301 continue;
304 } 302 }
305 if (!markerTypes.contains(list->begin()->type())) 303 if (!markerTypes.contains(list->begin()->type()))
306 continue; 304 continue;
307 unsigned endOffset = startOffset + length; 305 unsigned endOffset = startOffset + length;
308 MarkerList::iterator startPos = std::upper_bound(list->begin(), list->en d(), startOffset, endsBefore); 306 MarkerList::iterator startPos = std::upper_bound(list->begin(), list->en d(), startOffset, endsBefore);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 { 362 {
365 if (!possiblyHasMarkers(markerType)) 363 if (!possiblyHasMarkers(markerType))
366 return 0; 364 return 0;
367 ASSERT(!(m_markers.isEmpty())); 365 ASSERT(!(m_markers.isEmpty()));
368 366
369 // outer loop: process each node that contains any markers 367 // outer loop: process each node that contains any markers
370 MarkerMap::iterator end = m_markers.end(); 368 MarkerMap::iterator end = m_markers.end();
371 for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != e nd; ++nodeIterator) { 369 for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != e nd; ++nodeIterator) {
372 // inner loop; process each marker in this node 370 // inner loop; process each marker in this node
373 MarkerLists* markers = nodeIterator->value.get(); 371 MarkerLists* markers = nodeIterator->value.get();
374 OwnPtr<MarkerList>& list = (*markers)[MarkerTypeToMarkerIndex(markerType )]; 372 OwnPtrWillBeMember<MarkerList>& list = (*markers)[MarkerTypeToMarkerInde x(markerType)];
375 unsigned markerCount = list.get() ? list->size() : 0; 373 unsigned markerCount = list.get() ? list->size() : 0;
376 for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex) { 374 for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex) {
377 RenderedDocumentMarker& marker = list->at(markerIndex); 375 RenderedDocumentMarker& marker = list->at(markerIndex);
378 376
379 if (marker.contains(point)) 377 if (marker.contains(point))
380 return &marker; 378 return &marker;
381 } 379 }
382 } 380 }
383 381
384 return 0; 382 return 0;
385 } 383 }
386 384
387 Vector<DocumentMarker*> DocumentMarkerController::markersFor(Node* node, Documen tMarker::MarkerTypes markerTypes) 385 WillBeHeapVector<DocumentMarker*> DocumentMarkerController::markersFor(Node* nod e, DocumentMarker::MarkerTypes markerTypes)
388 { 386 {
389 Vector<DocumentMarker*> result; 387 WillBeHeapVector<DocumentMarker*> result;
390 388
391 MarkerLists* markers = m_markers.get(node); 389 MarkerLists* markers = m_markers.get(node);
392 if (!markers) 390 if (!markers)
393 return result; 391 return result;
394 392
395 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp eIndexesCount; ++markerListIndex) { 393 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp eIndexesCount; ++markerListIndex) {
396 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; 394 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex];
397 if (!list || list->isEmpty() || !markerTypes.contains(list->begin()->typ e())) 395 if (!list || list->isEmpty() || !markerTypes.contains(list->begin()->typ e()))
398 continue; 396 continue;
399 397
400 for (size_t i = 0; i < list->size(); ++i) 398 for (size_t i = 0; i < list->size(); ++i)
401 result.append(&(list->at(i))); 399 result.append(&(list->at(i)));
402 } 400 }
403 401
404 std::sort(result.begin(), result.end(), compareByStart); 402 std::sort(result.begin(), result.end(), compareByStart);
405 return result; 403 return result;
406 } 404 }
407 405
408 Vector<DocumentMarker*> DocumentMarkerController::markers() 406 WillBeHeapVector<DocumentMarker*> DocumentMarkerController::markers()
409 { 407 {
410 Vector<DocumentMarker*> result; 408 WillBeHeapVector<DocumentMarker*> result;
411 for (MarkerMap::iterator i = m_markers.begin(); i != m_markers.end(); ++i) { 409 for (MarkerMap::iterator i = m_markers.begin(); i != m_markers.end(); ++i) {
412 MarkerLists* markers = i->value.get(); 410 MarkerLists* markers = i->value.get();
413 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) { 411 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) {
414 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; 412 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex];
415 for (size_t j = 0; list.get() && j < list->size(); ++j) 413 for (size_t j = 0; list.get() && j < list->size(); ++j)
416 result.append(&(list->at(j))); 414 result.append(&(list->at(j)));
417 } 415 }
418 } 416 }
419 std::sort(result.begin(), result.end(), compareByStart); 417 std::sort(result.begin(), result.end(), compareByStart);
420 return result; 418 return result;
421 } 419 }
422 420
423 Vector<DocumentMarker*> DocumentMarkerController::markersInRange(Range* range, D ocumentMarker::MarkerTypes markerTypes) 421 WillBeHeapVector<DocumentMarker*> DocumentMarkerController::markersInRange(Range * range, DocumentMarker::MarkerTypes markerTypes)
424 { 422 {
425 if (!possiblyHasMarkers(markerTypes)) 423 if (!possiblyHasMarkers(markerTypes))
426 return Vector<DocumentMarker*>(); 424 return WillBeHeapVector<DocumentMarker*>();
427 425
428 Vector<DocumentMarker*> foundMarkers; 426 WillBeHeapVector<DocumentMarker*> foundMarkers;
429 427
430 Node* startContainer = range->startContainer(); 428 Node* startContainer = range->startContainer();
431 ASSERT(startContainer); 429 ASSERT(startContainer);
432 Node* endContainer = range->endContainer(); 430 Node* endContainer = range->endContainer();
433 ASSERT(endContainer); 431 ASSERT(endContainer);
434 432
435 Node* pastLastNode = range->pastLastNode(); 433 Node* pastLastNode = range->pastLastNode();
436 for (Node* node = range->firstNode(); node != pastLastNode; node = NodeTrave rsal::next(*node)) { 434 for (Node* node = range->firstNode(); node != pastLastNode; node = NodeTrave rsal::next(*node)) {
437 Vector<DocumentMarker*> markers = markersFor(node); 435 WillBeHeapVector<DocumentMarker*> markers = markersFor(node);
438 Vector<DocumentMarker*>::const_iterator end = markers.end(); 436 WillBeHeapVector<DocumentMarker*>::const_iterator end = markers.end();
439 for (Vector<DocumentMarker*>::const_iterator it = markers.begin(); it != end; ++it) { 437 for (WillBeHeapVector<DocumentMarker*>::const_iterator it = markers.begi n(); it != end; ++it) {
440 DocumentMarker* marker = *it; 438 DocumentMarker* marker = *it;
441 if (!markerTypes.contains(marker->type())) 439 if (!markerTypes.contains(marker->type()))
442 continue; 440 continue;
443 if (node == startContainer && marker->endOffset() <= static_cast<uns igned>(range->startOffset())) 441 if (node == startContainer && marker->endOffset() <= static_cast<uns igned>(range->startOffset()))
444 continue; 442 continue;
445 if (node == endContainer && marker->startOffset() >= static_cast<uns igned>(range->endOffset())) 443 if (node == endContainer && marker->startOffset() >= static_cast<uns igned>(range->endOffset()))
446 continue; 444 continue;
447 foundMarkers.append(marker); 445 foundMarkers.append(marker);
448 } 446 }
449 } 447 }
450 return foundMarkers; 448 return foundMarkers;
451 } 449 }
452 450
453 Vector<IntRect> DocumentMarkerController::renderedRectsForMarkers(DocumentMarker ::MarkerType markerType) 451 Vector<IntRect> DocumentMarkerController::renderedRectsForMarkers(DocumentMarker ::MarkerType markerType)
454 { 452 {
455 Vector<IntRect> result; 453 Vector<IntRect> result;
456 454
457 if (!possiblyHasMarkers(markerType)) 455 if (!possiblyHasMarkers(markerType))
458 return result; 456 return result;
459 ASSERT(!(m_markers.isEmpty())); 457 ASSERT(!(m_markers.isEmpty()));
460 458
461 // outer loop: process each node 459 // outer loop: process each node
462 MarkerMap::iterator end = m_markers.end(); 460 MarkerMap::iterator end = m_markers.end();
463 for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != e nd; ++nodeIterator) { 461 for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != e nd; ++nodeIterator) {
464 // inner loop; process each marker in this node 462 // inner loop; process each marker in this node
465 MarkerLists* markers = nodeIterator->value.get(); 463 MarkerLists* markers = nodeIterator->value.get();
466 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) { 464 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) {
467 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; 465 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex];
468 if (!list || list->isEmpty() || list->begin()->type() != markerType) 466 if (!list || list->isEmpty() || list->begin()->type() != markerType)
469 continue; 467 continue;
470 for (unsigned markerIndex = 0; markerIndex < list->size(); ++markerI ndex) { 468 for (unsigned markerIndex = 0; markerIndex < list->size(); ++markerI ndex) {
471 const RenderedDocumentMarker& marker = list->at(markerIndex); 469 const RenderedDocumentMarker& marker = list->at(markerIndex);
472 470
473 if (!marker.isRendered()) 471 if (!marker.isRendered())
474 continue; 472 continue;
475 473
476 result.append(marker.renderedRect()); 474 result.append(marker.renderedRect());
477 } 475 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 bool nodeCanBeRemoved; 519 bool nodeCanBeRemoved;
522 520
523 size_t emptyListsCount = 0; 521 size_t emptyListsCount = 0;
524 if (markerTypes == DocumentMarker::AllMarkers()) { 522 if (markerTypes == DocumentMarker::AllMarkers()) {
525 needsRepainting = true; 523 needsRepainting = true;
526 nodeCanBeRemoved = true; 524 nodeCanBeRemoved = true;
527 } else { 525 } else {
528 MarkerLists* markers = iterator->value.get(); 526 MarkerLists* markers = iterator->value.get();
529 527
530 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) { 528 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) {
531 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; 529 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex];
532 if (!list || list->isEmpty()) { 530 if (!list || list->isEmpty()) {
533 if (list.get() && list->isEmpty()) 531 if (list.get() && list->isEmpty())
534 list.clear(); 532 list.clear();
535 ++emptyListsCount; 533 ++emptyListsCount;
536 continue; 534 continue;
537 } 535 }
538 if (markerTypes.contains(list->begin()->type())) { 536 if (markerTypes.contains(list->begin()->type())) {
539 list->clear(); 537 list->clear();
540 list.clear(); 538 list.clear();
541 ++emptyListsCount; 539 ++emptyListsCount;
(...skipping 23 matching lines...) Expand all
565 ASSERT(!m_markers.isEmpty()); 563 ASSERT(!m_markers.isEmpty());
566 564
567 // outer loop: process each markered node in the document 565 // outer loop: process each markered node in the document
568 MarkerMap::iterator end = m_markers.end(); 566 MarkerMap::iterator end = m_markers.end();
569 for (MarkerMap::iterator i = m_markers.begin(); i != end; ++i) { 567 for (MarkerMap::iterator i = m_markers.begin(); i != end; ++i) {
570 const Node* node = i->key; 568 const Node* node = i->key;
571 569
572 // inner loop: process each marker in the current node 570 // inner loop: process each marker in the current node
573 MarkerLists* markers = i->value.get(); 571 MarkerLists* markers = i->value.get();
574 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) { 572 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) {
575 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; 573 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex];
576 if (!list || list->isEmpty() || !markerTypes.contains(list->begin()- >type())) 574 if (!list || list->isEmpty() || !markerTypes.contains(list->begin()- >type()))
577 continue; 575 continue;
578 576
579 // cause the node to be redrawn 577 // cause the node to be redrawn
580 if (RenderObject* renderer = node->renderer()) { 578 if (RenderObject* renderer = node->renderer()) {
581 renderer->repaint(); 579 renderer->repaint();
582 break; 580 break;
583 } 581 }
584 } 582 }
585 } 583 }
586 } 584 }
587 585
588 void DocumentMarkerController::invalidateRenderedRectsForMarkersInRect(const Lay outRect& r) 586 void DocumentMarkerController::invalidateRenderedRectsForMarkersInRect(const Lay outRect& r)
589 { 587 {
590 // outer loop: process each markered node in the document 588 // outer loop: process each markered node in the document
591 MarkerMap::iterator end = m_markers.end(); 589 MarkerMap::iterator end = m_markers.end();
592 for (MarkerMap::iterator i = m_markers.begin(); i != end; ++i) { 590 for (MarkerMap::iterator i = m_markers.begin(); i != end; ++i) {
593 591
594 // inner loop: process each rect in the current node 592 // inner loop: process each rect in the current node
595 MarkerLists* markers = i->value.get(); 593 MarkerLists* markers = i->value.get();
596 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) { 594 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) {
597 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; 595 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex];
598 for (size_t markerIndex = 0; list.get() && markerIndex < list->size( ); ++markerIndex) 596 for (size_t markerIndex = 0; list.get() && markerIndex < list->size( ); ++markerIndex)
599 list->at(markerIndex).invalidate(r); 597 list->at(markerIndex).invalidate(r);
600 } 598 }
601 } 599 }
602 } 600 }
603 601
604 void DocumentMarkerController::shiftMarkers(Node* node, unsigned startOffset, in t delta) 602 void DocumentMarkerController::shiftMarkers(Node* node, unsigned startOffset, in t delta)
605 { 603 {
606 if (!possiblyHasMarkers(DocumentMarker::AllMarkers())) 604 if (!possiblyHasMarkers(DocumentMarker::AllMarkers()))
607 return; 605 return;
608 ASSERT(!m_markers.isEmpty()); 606 ASSERT(!m_markers.isEmpty());
609 607
610 MarkerLists* markers = m_markers.get(node); 608 MarkerLists* markers = m_markers.get(node);
611 if (!markers) 609 if (!markers)
612 return; 610 return;
613 611
614 bool docDirty = false; 612 bool docDirty = false;
615 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp eIndexesCount; ++markerListIndex) { 613 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp eIndexesCount; ++markerListIndex) {
616 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; 614 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex];
617 if (!list) 615 if (!list)
618 continue; 616 continue;
619 MarkerList::iterator startPos = std::lower_bound(list->begin(), list->en d(), startOffset, startsAfter); 617 MarkerList::iterator startPos = std::lower_bound(list->begin(), list->en d(), startOffset, startsAfter);
620 for (MarkerList::iterator marker = startPos; marker != list->end(); ++ma rker) { 618 for (MarkerList::iterator marker = startPos; marker != list->end(); ++ma rker) {
621 ASSERT((int)marker->startOffset() + delta >= 0); 619 ASSERT((int)marker->startOffset() + delta >= 0);
622 marker->shiftOffsets(delta); 620 marker->shiftOffsets(delta);
623 docDirty = true; 621 docDirty = true;
624 622
625 // Marker moved, so previously-computed rendered rectangle is now in valid 623 // Marker moved, so previously-computed rendered rectangle is now in valid
626 marker->invalidate(); 624 marker->invalidate();
(...skipping 23 matching lines...) Expand all
650 } 648 }
651 } 649 }
652 650
653 void DocumentMarkerController::setMarkersActive(Node* node, unsigned startOffset , unsigned endOffset, bool active) 651 void DocumentMarkerController::setMarkersActive(Node* node, unsigned startOffset , unsigned endOffset, bool active)
654 { 652 {
655 MarkerLists* markers = m_markers.get(node); 653 MarkerLists* markers = m_markers.get(node);
656 if (!markers) 654 if (!markers)
657 return; 655 return;
658 656
659 bool docDirty = false; 657 bool docDirty = false;
660 OwnPtr<MarkerList>& list = (*markers)[MarkerTypeToMarkerIndex(DocumentMarker ::TextMatch)]; 658 OwnPtrWillBeMember<MarkerList>& list = (*markers)[MarkerTypeToMarkerIndex(Do cumentMarker::TextMatch)];
661 if (!list) 659 if (!list)
662 return; 660 return;
663 MarkerList::iterator startPos = std::upper_bound(list->begin(), list->end(), startOffset, endsBefore); 661 MarkerList::iterator startPos = std::upper_bound(list->begin(), list->end(), startOffset, endsBefore);
664 for (MarkerList::iterator marker = startPos; marker != list->end(); ++marker ) { 662 for (MarkerList::iterator marker = startPos; marker != list->end(); ++marker ) {
665 663
666 // Markers are returned in order, so stop if we are now past the specifi ed range. 664 // Markers are returned in order, so stop if we are now past the specifi ed range.
667 if (marker->startOffset() >= endOffset) 665 if (marker->startOffset() >= endOffset)
668 break; 666 break;
669 667
670 marker->setActiveMatch(active); 668 marker->setActiveMatch(active);
(...skipping 11 matching lines...) Expand all
682 return false; 680 return false;
683 ASSERT(!m_markers.isEmpty()); 681 ASSERT(!m_markers.isEmpty());
684 682
685 Node* startContainer = range->startContainer(); 683 Node* startContainer = range->startContainer();
686 ASSERT(startContainer); 684 ASSERT(startContainer);
687 Node* endContainer = range->endContainer(); 685 Node* endContainer = range->endContainer();
688 ASSERT(endContainer); 686 ASSERT(endContainer);
689 687
690 Node* pastLastNode = range->pastLastNode(); 688 Node* pastLastNode = range->pastLastNode();
691 for (Node* node = range->firstNode(); node != pastLastNode; node = NodeTrave rsal::next(*node)) { 689 for (Node* node = range->firstNode(); node != pastLastNode; node = NodeTrave rsal::next(*node)) {
692 Vector<DocumentMarker*> markers = markersFor(node); 690 WillBeHeapVector<DocumentMarker*> markers = markersFor(node);
693 Vector<DocumentMarker*>::const_iterator end = markers.end(); 691 WillBeHeapVector<DocumentMarker*>::const_iterator end = markers.end();
694 for (Vector<DocumentMarker*>::const_iterator it = markers.begin(); it != end; ++it) { 692 for (WillBeHeapVector<DocumentMarker*>::const_iterator it = markers.begi n(); it != end; ++it) {
695 DocumentMarker* marker = *it; 693 DocumentMarker* marker = *it;
696 if (!markerTypes.contains(marker->type())) 694 if (!markerTypes.contains(marker->type()))
697 continue; 695 continue;
698 if (node == startContainer && marker->endOffset() <= static_cast<uns igned>(range->startOffset())) 696 if (node == startContainer && marker->endOffset() <= static_cast<uns igned>(range->startOffset()))
699 continue; 697 continue;
700 if (node == endContainer && marker->startOffset() >= static_cast<uns igned>(range->endOffset())) 698 if (node == endContainer && marker->startOffset() >= static_cast<uns igned>(range->endOffset()))
701 continue; 699 continue;
702 return true; 700 return true;
703 } 701 }
704 } 702 }
705 return false; 703 return false;
706 } 704 }
707 705
708 #ifndef NDEBUG 706 #ifndef NDEBUG
709 void DocumentMarkerController::showMarkers() const 707 void DocumentMarkerController::showMarkers() const
710 { 708 {
711 fprintf(stderr, "%d nodes have markers:\n", m_markers.size()); 709 fprintf(stderr, "%d nodes have markers:\n", m_markers.size());
712 MarkerMap::const_iterator end = m_markers.end(); 710 MarkerMap::const_iterator end = m_markers.end();
713 for (MarkerMap::const_iterator nodeIterator = m_markers.begin(); nodeIterato r != end; ++nodeIterator) { 711 for (MarkerMap::const_iterator nodeIterator = m_markers.begin(); nodeIterato r != end; ++nodeIterator) {
714 const Node* node = nodeIterator->key; 712 const Node* node = nodeIterator->key;
715 fprintf(stderr, "%p", node); 713 fprintf(stderr, "%p", node);
716 MarkerLists* markers = m_markers.get(node); 714 MarkerLists* markers = m_markers.get(node);
717 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) { 715 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke rTypeIndexesCount; ++markerListIndex) {
718 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; 716 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex];
719 for (unsigned markerIndex = 0; list.get() && markerIndex < list->siz e(); ++markerIndex) { 717 for (unsigned markerIndex = 0; list.get() && markerIndex < list->siz e(); ++markerIndex) {
720 const DocumentMarker& marker = list->at(markerIndex); 718 const DocumentMarker& marker = list->at(markerIndex);
721 fprintf(stderr, " %d:[%d:%d](%d)", marker.type(), marker.startOf fset(), marker.endOffset(), marker.activeMatch()); 719 fprintf(stderr, " %d:[%d:%d](%d)", marker.type(), marker.startOf fset(), marker.endOffset(), marker.activeMatch());
722 } 720 }
723 } 721 }
724 722
725 fprintf(stderr, "\n"); 723 fprintf(stderr, "\n");
726 } 724 }
727 } 725 }
728 #endif 726 #endif
729 727
730 } // namespace WebCore 728 } // namespace WebCore
731 729
732 #ifndef NDEBUG 730 #ifndef NDEBUG
733 void showDocumentMarkers(const WebCore::DocumentMarkerController* controller) 731 void showDocumentMarkers(const WebCore::DocumentMarkerController* controller)
734 { 732 {
735 if (controller) 733 if (controller)
736 controller->showMarkers(); 734 controller->showMarkers();
737 } 735 }
738 #endif 736 #endif
OLDNEW
« no previous file with comments | « Source/core/dom/DocumentMarkerController.h ('k') | Source/core/dom/RenderedDocumentMarker.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698