| 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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 } | 123 } |
| 124 | 124 |
| 125 void DocumentMarkerController::addTextMatchMarker(const Range* range, bool activ
eMatch) | 125 void DocumentMarkerController::addTextMatchMarker(const Range* range, bool activ
eMatch) |
| 126 { | 126 { |
| 127 // Use a TextIterator to visit the potentially multiple nodes the range cove
rs. | 127 // Use a TextIterator to visit the potentially multiple nodes the range cove
rs. |
| 128 for (TextIterator markedText(range); !markedText.atEnd(); markedText.advance
()) { | 128 for (TextIterator markedText(range); !markedText.atEnd(); markedText.advance
()) { |
| 129 RefPtr<Range> textPiece = markedText.range(); | 129 RefPtr<Range> textPiece = markedText.range(); |
| 130 unsigned startOffset = textPiece->startOffset(); | 130 unsigned startOffset = textPiece->startOffset(); |
| 131 unsigned endOffset = textPiece->endOffset(); | 131 unsigned endOffset = textPiece->endOffset(); |
| 132 addMarker(textPiece->startContainer(), DocumentMarker(startOffset, endOf
fset, activeMatch)); | 132 addMarker(textPiece->startContainer(), DocumentMarker(startOffset, endOf
fset, activeMatch)); |
| 133 if (endOffset > startOffset) { | |
| 134 // Rendered rects for markers in WebKit are not populated until each
time | |
| 135 // the markers are painted. However, we need it to happen sooner, be
cause | |
| 136 // the whole purpose of tickmarks on the scrollbar is to show where | |
| 137 // matches off-screen are (that haven't been painted yet). | |
| 138 Node* node = textPiece->startContainer(); | |
| 139 DocumentMarkerVector markers = markersFor(node); | |
| 140 toRenderedDocumentMarker(markers[markers.size() - 1])->setRenderedRe
ct(range->boundingBox()); | |
| 141 } | |
| 142 } | 133 } |
| 143 } | 134 } |
| 144 | 135 |
| 145 void DocumentMarkerController::prepareForDestruction() | 136 void DocumentMarkerController::prepareForDestruction() |
| 146 { | 137 { |
| 147 clear(); | 138 clear(); |
| 148 } | 139 } |
| 149 | 140 |
| 150 void DocumentMarkerController::removeMarkers(Range* range, DocumentMarker::Marke
rTypes markerTypes, RemovePartiallyOverlappingMarkerOrNot shouldRemovePartiallyO
verlappingMarker) | 141 void DocumentMarkerController::removeMarkers(Range* range, DocumentMarker::Marke
rTypes markerTypes, RemovePartiallyOverlappingMarkerOrNot shouldRemovePartiallyO
verlappingMarker) |
| 151 { | 142 { |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 } | 345 } |
| 355 } | 346 } |
| 356 | 347 |
| 357 if (emptyListsCount == DocumentMarker::MarkerTypeIndexesCount) { | 348 if (emptyListsCount == DocumentMarker::MarkerTypeIndexesCount) { |
| 358 m_markers.remove(node); | 349 m_markers.remove(node); |
| 359 if (m_markers.isEmpty()) | 350 if (m_markers.isEmpty()) |
| 360 m_possiblyExistingMarkerTypes = 0; | 351 m_possiblyExistingMarkerTypes = 0; |
| 361 } | 352 } |
| 362 } | 353 } |
| 363 | 354 |
| 364 DocumentMarker* DocumentMarkerController::markerContainingPoint(const LayoutPoin
t& point, DocumentMarker::MarkerType markerType) | |
| 365 { | |
| 366 if (!possiblyHasMarkers(markerType)) | |
| 367 return 0; | |
| 368 ASSERT(!(m_markers.isEmpty())); | |
| 369 | |
| 370 // outer loop: process each node that contains any markers | |
| 371 MarkerMap::iterator end = m_markers.end(); | |
| 372 for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != e
nd; ++nodeIterator) { | |
| 373 // inner loop; process each marker in this node | |
| 374 MarkerLists* markers = nodeIterator->value.get(); | |
| 375 OwnPtr<MarkerList>& list = (*markers)[MarkerTypeToMarkerIndex(markerType
)]; | |
| 376 unsigned markerCount = list.get() ? list->size() : 0; | |
| 377 for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex)
{ | |
| 378 RenderedDocumentMarker* marker = list->at(markerIndex).get(); | |
| 379 if (marker->contains(point)) | |
| 380 return marker; | |
| 381 } | |
| 382 } | |
| 383 | |
| 384 return 0; | |
| 385 } | |
| 386 | |
| 387 DocumentMarkerVector DocumentMarkerController::markersFor(Node* node, DocumentMa
rker::MarkerTypes markerTypes) | 355 DocumentMarkerVector DocumentMarkerController::markersFor(Node* node, DocumentMa
rker::MarkerTypes markerTypes) |
| 388 { | 356 { |
| 389 DocumentMarkerVector result; | 357 DocumentMarkerVector result; |
| 390 | 358 |
| 391 MarkerLists* markers = m_markers.get(node); | 359 MarkerLists* markers = m_markers.get(node); |
| 392 if (!markers) | 360 if (!markers) |
| 393 return result; | 361 return result; |
| 394 | 362 |
| 395 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp
eIndexesCount; ++markerListIndex) { | 363 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp
eIndexesCount; ++markerListIndex) { |
| 396 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; | 364 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 if (node == startContainer && marker->endOffset() <= static_cast<uns
igned>(range->startOffset())) | 411 if (node == startContainer && marker->endOffset() <= static_cast<uns
igned>(range->startOffset())) |
| 444 continue; | 412 continue; |
| 445 if (node == endContainer && marker->startOffset() >= static_cast<uns
igned>(range->endOffset())) | 413 if (node == endContainer && marker->startOffset() >= static_cast<uns
igned>(range->endOffset())) |
| 446 continue; | 414 continue; |
| 447 foundMarkers.append(marker); | 415 foundMarkers.append(marker); |
| 448 } | 416 } |
| 449 } | 417 } |
| 450 return foundMarkers; | 418 return foundMarkers; |
| 451 } | 419 } |
| 452 | 420 |
| 453 Vector<IntRect> DocumentMarkerController::renderedRectsForMarkers(DocumentMarker
::MarkerType markerType) | |
| 454 { | |
| 455 Vector<IntRect> result; | |
| 456 | |
| 457 if (!possiblyHasMarkers(markerType)) | |
| 458 return result; | |
| 459 ASSERT(!(m_markers.isEmpty())); | |
| 460 | |
| 461 // outer loop: process each node | |
| 462 MarkerMap::iterator end = m_markers.end(); | |
| 463 for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != e
nd; ++nodeIterator) { | |
| 464 // inner loop; process each marker in this node | |
| 465 MarkerLists* markers = nodeIterator->value.get(); | |
| 466 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke
rTypeIndexesCount; ++markerListIndex) { | |
| 467 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; | |
| 468 if (!list || list->isEmpty() || (*list->begin())->type() != markerTy
pe) | |
| 469 continue; | |
| 470 for (unsigned markerIndex = 0; markerIndex < list->size(); ++markerI
ndex) { | |
| 471 RenderedDocumentMarker* marker = list->at(markerIndex).get(); | |
| 472 if (!marker->isRendered()) | |
| 473 continue; | |
| 474 result.append(marker->renderedRect()); | |
| 475 } | |
| 476 } | |
| 477 } | |
| 478 | |
| 479 return result; | |
| 480 } | |
| 481 | |
| 482 void DocumentMarkerController::removeMarkers(Node* node, DocumentMarker::MarkerT
ypes markerTypes) | 421 void DocumentMarkerController::removeMarkers(Node* node, DocumentMarker::MarkerT
ypes markerTypes) |
| 483 { | 422 { |
| 484 if (!possiblyHasMarkers(markerTypes)) | 423 if (!possiblyHasMarkers(markerTypes)) |
| 485 return; | 424 return; |
| 486 ASSERT(!m_markers.isEmpty()); | 425 ASSERT(!m_markers.isEmpty()); |
| 487 | 426 |
| 488 MarkerMap::iterator iterator = m_markers.find(node); | 427 MarkerMap::iterator iterator = m_markers.find(node); |
| 489 if (iterator != m_markers.end()) | 428 if (iterator != m_markers.end()) |
| 490 removeMarkersFromList(iterator, markerTypes); | 429 removeMarkersFromList(iterator, markerTypes); |
| 491 } | 430 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 nodeCanBeRemoved = emptyListsCount == DocumentMarker::MarkerTypeIndexesC
ount; | 497 nodeCanBeRemoved = emptyListsCount == DocumentMarker::MarkerTypeIndexesC
ount; |
| 559 } | 498 } |
| 560 | 499 |
| 561 if (nodeCanBeRemoved) { | 500 if (nodeCanBeRemoved) { |
| 562 m_markers.remove(iterator); | 501 m_markers.remove(iterator); |
| 563 if (m_markers.isEmpty()) | 502 if (m_markers.isEmpty()) |
| 564 m_possiblyExistingMarkerTypes = 0; | 503 m_possiblyExistingMarkerTypes = 0; |
| 565 } | 504 } |
| 566 } | 505 } |
| 567 | 506 |
| 568 void DocumentMarkerController::invalidateRenderedRectsForMarkersInRect(const Lay
outRect& r) | |
| 569 { | |
| 570 // outer loop: process each markered node in the document | |
| 571 MarkerMap::iterator end = m_markers.end(); | |
| 572 for (MarkerMap::iterator i = m_markers.begin(); i != end; ++i) { | |
| 573 | |
| 574 // inner loop: process each rect in the current node | |
| 575 MarkerLists* markers = i->value.get(); | |
| 576 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke
rTypeIndexesCount; ++markerListIndex) { | |
| 577 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; | |
| 578 for (size_t markerIndex = 0; list.get() && markerIndex < list->size(
); ++markerIndex) | |
| 579 list->at(markerIndex)->invalidate(r); | |
| 580 } | |
| 581 } | |
| 582 } | |
| 583 | |
| 584 void DocumentMarkerController::shiftMarkers(Node* node, unsigned startOffset, in
t delta) | 507 void DocumentMarkerController::shiftMarkers(Node* node, unsigned startOffset, in
t delta) |
| 585 { | 508 { |
| 586 if (!possiblyHasMarkers(DocumentMarker::AllMarkers())) | 509 if (!possiblyHasMarkers(DocumentMarker::AllMarkers())) |
| 587 return; | 510 return; |
| 588 ASSERT(!m_markers.isEmpty()); | 511 ASSERT(!m_markers.isEmpty()); |
| 589 | 512 |
| 590 MarkerLists* markers = m_markers.get(node); | 513 MarkerLists* markers = m_markers.get(node); |
| 591 if (!markers) | 514 if (!markers) |
| 592 return; | 515 return; |
| 593 | 516 |
| 594 bool docDirty = false; | 517 bool docDirty = false; |
| 595 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp
eIndexesCount; ++markerListIndex) { | 518 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTyp
eIndexesCount; ++markerListIndex) { |
| 596 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; | 519 OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; |
| 597 if (!list) | 520 if (!list) |
| 598 continue; | 521 continue; |
| 599 MarkerList::iterator startPos = std::lower_bound(list->begin(), list->en
d(), startOffset, startsAfter); | 522 MarkerList::iterator startPos = std::lower_bound(list->begin(), list->en
d(), startOffset, startsAfter); |
| 600 for (MarkerList::iterator marker = startPos; marker != list->end(); ++ma
rker) { | 523 for (MarkerList::iterator marker = startPos; marker != list->end(); ++ma
rker) { |
| 601 #if ENABLE(ASSERT) | 524 #if ENABLE(ASSERT) |
| 602 int startOffset = (*marker)->startOffset(); | 525 int startOffset = (*marker)->startOffset(); |
| 603 ASSERT(startOffset + delta >= 0); | 526 ASSERT(startOffset + delta >= 0); |
| 604 #endif | 527 #endif |
| 605 (*marker)->shiftOffsets(delta); | 528 (*marker)->shiftOffsets(delta); |
| 606 docDirty = true; | 529 docDirty = true; |
| 607 | |
| 608 // Marker moved, so previously-computed rendered rectangle is now in
valid | |
| 609 (*marker)->invalidate(); | |
| 610 } | 530 } |
| 611 } | 531 } |
| 612 } | 532 } |
| 613 | 533 |
| 614 void DocumentMarkerController::setMarkersActive(Range* range, bool active) | 534 void DocumentMarkerController::setMarkersActive(Range* range, bool active) |
| 615 { | 535 { |
| 616 if (!possiblyHasMarkers(DocumentMarker::AllMarkers())) | 536 if (!possiblyHasMarkers(DocumentMarker::AllMarkers())) |
| 617 return; | 537 return; |
| 618 ASSERT(!m_markers.isEmpty()); | 538 ASSERT(!m_markers.isEmpty()); |
| 619 | 539 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 | 624 |
| 705 } // namespace blink | 625 } // namespace blink |
| 706 | 626 |
| 707 #ifndef NDEBUG | 627 #ifndef NDEBUG |
| 708 void showDocumentMarkers(const blink::DocumentMarkerController* controller) | 628 void showDocumentMarkers(const blink::DocumentMarkerController* controller) |
| 709 { | 629 { |
| 710 if (controller) | 630 if (controller) |
| 711 controller->showMarkers(); | 631 controller->showMarkers(); |
| 712 } | 632 } |
| 713 #endif | 633 #endif |
| OLD | NEW |