| 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 |