OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 ▮ | 378 return ▮ |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |