| 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 | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights |
| 7 * reserved. | 7 * reserved. |
| 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
| 9 * (http://www.torchmobile.com/) | 9 * (http://www.torchmobile.com/) |
| 10 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 if (!src_markers) | 245 if (!src_markers) |
| 246 return; | 246 return; |
| 247 | 247 |
| 248 if (!markers_.Contains(dst_node)) { | 248 if (!markers_.Contains(dst_node)) { |
| 249 markers_.insert(dst_node, | 249 markers_.insert(dst_node, |
| 250 new MarkerLists(DocumentMarker::kMarkerTypeIndexesCount)); | 250 new MarkerLists(DocumentMarker::kMarkerTypeIndexesCount)); |
| 251 } | 251 } |
| 252 MarkerLists* dst_markers = markers_.at(dst_node); | 252 MarkerLists* dst_markers = markers_.at(dst_node); |
| 253 | 253 |
| 254 bool doc_dirty = false; | 254 bool doc_dirty = false; |
| 255 for (size_t marker_list_index = 0; marker_list_index < src_markers->size(); | 255 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { |
| 256 ++marker_list_index) { | 256 MarkerList* src_list = ListForType(src_markers, type); |
| 257 MarkerList* src_list = src_markers->at(marker_list_index); | |
| 258 if (!src_list) | 257 if (!src_list) |
| 259 continue; | 258 continue; |
| 260 | 259 |
| 261 if (!dst_markers->at(marker_list_index)) | 260 if (!ListForType(dst_markers, type)) |
| 262 dst_markers->at(marker_list_index) = new MarkerList; | 261 ListForType(dst_markers, type) = new MarkerList; |
| 263 MarkerList* dst_list = dst_markers->at(marker_list_index); | 262 MarkerList* dst_list = ListForType(dst_markers, type); |
| 264 | 263 |
| 265 if (DocumentMarkerListEditor::MoveMarkers(src_list, length, dst_list)) | 264 if (DocumentMarkerListEditor::MoveMarkers(src_list, length, dst_list)) |
| 266 doc_dirty = true; | 265 doc_dirty = true; |
| 267 } | 266 } |
| 268 | 267 |
| 269 // repaint the affected node | 268 // repaint the affected node |
| 270 if (doc_dirty && dst_node->GetLayoutObject()) { | 269 if (doc_dirty && dst_node->GetLayoutObject()) { |
| 271 dst_node->GetLayoutObject()->SetShouldDoFullPaintInvalidation( | 270 dst_node->GetLayoutObject()->SetShouldDoFullPaintInvalidation( |
| 272 kPaintInvalidationDocumentMarkerChange); | 271 kPaintInvalidationDocumentMarkerChange); |
| 273 } | 272 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 284 if (!PossiblyHasMarkers(marker_types)) | 283 if (!PossiblyHasMarkers(marker_types)) |
| 285 return; | 284 return; |
| 286 DCHECK(!(markers_.IsEmpty())); | 285 DCHECK(!(markers_.IsEmpty())); |
| 287 | 286 |
| 288 MarkerLists* markers = markers_.at(node); | 287 MarkerLists* markers = markers_.at(node); |
| 289 if (!markers) | 288 if (!markers) |
| 290 return; | 289 return; |
| 291 | 290 |
| 292 bool doc_dirty = false; | 291 bool doc_dirty = false; |
| 293 size_t empty_lists_count = 0; | 292 size_t empty_lists_count = 0; |
| 294 for (size_t marker_list_index = 0; | 293 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { |
| 295 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; | 294 Member<MarkerList>& list = ListForType(markers, type); |
| 296 ++marker_list_index) { | |
| 297 Member<MarkerList>& list = (*markers)[marker_list_index]; | |
| 298 if (!list || list->IsEmpty()) { | 295 if (!list || list->IsEmpty()) { |
| 299 if (list.Get() && list->IsEmpty()) | 296 if (list.Get() && list->IsEmpty()) |
| 300 list.Clear(); | 297 list.Clear(); |
| 301 ++empty_lists_count; | 298 ++empty_lists_count; |
| 302 continue; | 299 continue; |
| 303 } | 300 } |
| 304 if (!marker_types.Contains((*list->begin())->GetType())) | 301 if (!marker_types.Contains(type)) |
| 305 continue; | 302 continue; |
| 306 | 303 |
| 307 if (DocumentMarkerListEditor::RemoveMarkers(list, start_offset, length)) | 304 if (DocumentMarkerListEditor::RemoveMarkers(list, start_offset, length)) |
| 308 doc_dirty = true; | 305 doc_dirty = true; |
| 309 | 306 |
| 310 if (list->IsEmpty()) { | 307 if (list->IsEmpty()) { |
| 311 list.Clear(); | 308 list.Clear(); |
| 312 ++empty_lists_count; | 309 ++empty_lists_count; |
| 313 } | 310 } |
| 314 } | 311 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 328 | 325 |
| 329 DocumentMarkerVector DocumentMarkerController::MarkersFor( | 326 DocumentMarkerVector DocumentMarkerController::MarkersFor( |
| 330 Node* node, | 327 Node* node, |
| 331 DocumentMarker::MarkerTypes marker_types) { | 328 DocumentMarker::MarkerTypes marker_types) { |
| 332 DocumentMarkerVector result; | 329 DocumentMarkerVector result; |
| 333 | 330 |
| 334 MarkerLists* markers = markers_.at(node); | 331 MarkerLists* markers = markers_.at(node); |
| 335 if (!markers) | 332 if (!markers) |
| 336 return result; | 333 return result; |
| 337 | 334 |
| 338 for (size_t marker_list_index = 0; | 335 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { |
| 339 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; | 336 Member<MarkerList>& list = ListForType(markers, type); |
| 340 ++marker_list_index) { | |
| 341 Member<MarkerList>& list = (*markers)[marker_list_index]; | |
| 342 if (!list || list->IsEmpty() || | 337 if (!list || list->IsEmpty() || |
| 343 !marker_types.Contains((*list->begin())->GetType())) | 338 !marker_types.Contains((*list->begin())->GetType())) |
| 344 continue; | 339 continue; |
| 345 | 340 |
| 346 for (size_t i = 0; i < list->size(); ++i) | 341 for (size_t i = 0; i < list->size(); ++i) |
| 347 result.push_back(list->at(i).Get()); | 342 result.push_back(list->at(i).Get()); |
| 348 } | 343 } |
| 349 | 344 |
| 350 std::sort(result.begin(), result.end(), | 345 std::sort(result.begin(), result.end(), |
| 351 [](const Member<DocumentMarker>& marker1, | 346 [](const Member<DocumentMarker>& marker1, |
| 352 const Member<DocumentMarker>& marker2) { | 347 const Member<DocumentMarker>& marker2) { |
| 353 return marker1->StartOffset() < marker2->StartOffset(); | 348 return marker1->StartOffset() < marker2->StartOffset(); |
| 354 }); | 349 }); |
| 355 return result; | 350 return result; |
| 356 } | 351 } |
| 357 | 352 |
| 358 DocumentMarkerVector DocumentMarkerController::Markers() { | 353 DocumentMarkerVector DocumentMarkerController::Markers() { |
| 359 DocumentMarkerVector result; | 354 DocumentMarkerVector result; |
| 360 for (MarkerMap::iterator i = markers_.begin(); i != markers_.end(); ++i) { | 355 for (MarkerMap::iterator i = markers_.begin(); i != markers_.end(); ++i) { |
| 361 MarkerLists* markers = i->value.Get(); | 356 MarkerLists* markers = i->value.Get(); |
| 362 for (size_t marker_list_index = 0; | 357 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { |
| 363 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; | 358 Member<MarkerList>& list = ListForType(markers, type); |
| 364 ++marker_list_index) { | |
| 365 Member<MarkerList>& list = (*markers)[marker_list_index]; | |
| 366 for (size_t j = 0; list.Get() && j < list->size(); ++j) | 359 for (size_t j = 0; list.Get() && j < list->size(); ++j) |
| 367 result.push_back(list->at(j).Get()); | 360 result.push_back(list->at(j).Get()); |
| 368 } | 361 } |
| 369 } | 362 } |
| 370 std::sort(result.begin(), result.end(), | 363 std::sort(result.begin(), result.end(), |
| 371 [](const Member<DocumentMarker>& marker1, | 364 [](const Member<DocumentMarker>& marker1, |
| 372 const Member<DocumentMarker>& marker2) { | 365 const Member<DocumentMarker>& marker2) { |
| 373 return marker1->StartOffset() < marker2->StartOffset(); | 366 return marker1->StartOffset() < marker2->StartOffset(); |
| 374 }); | 367 }); |
| 375 return result; | 368 return result; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 | 409 |
| 417 // outer loop: process each node | 410 // outer loop: process each node |
| 418 MarkerMap::iterator end = markers_.end(); | 411 MarkerMap::iterator end = markers_.end(); |
| 419 for (MarkerMap::iterator node_iterator = markers_.begin(); | 412 for (MarkerMap::iterator node_iterator = markers_.begin(); |
| 420 node_iterator != end; ++node_iterator) { | 413 node_iterator != end; ++node_iterator) { |
| 421 // inner loop; process each marker in this node | 414 // inner loop; process each marker in this node |
| 422 const Node& node = *node_iterator->key; | 415 const Node& node = *node_iterator->key; |
| 423 if (!node.isConnected()) | 416 if (!node.isConnected()) |
| 424 continue; | 417 continue; |
| 425 MarkerLists* markers = node_iterator->value.Get(); | 418 MarkerLists* markers = node_iterator->value.Get(); |
| 426 for (size_t marker_list_index = 0; | 419 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { |
| 427 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; | 420 Member<MarkerList>& list = ListForType(markers, type); |
| 428 ++marker_list_index) { | 421 if (!list || list->IsEmpty() || type != marker_type) |
| 429 Member<MarkerList>& list = (*markers)[marker_list_index]; | |
| 430 if (!list || list->IsEmpty() || | |
| 431 (*list->begin())->GetType() != marker_type) | |
| 432 continue; | 422 continue; |
| 433 for (unsigned marker_index = 0; marker_index < list->size(); | 423 for (unsigned marker_index = 0; marker_index < list->size(); |
| 434 ++marker_index) { | 424 ++marker_index) { |
| 435 RenderedDocumentMarker* marker = list->at(marker_index).Get(); | 425 RenderedDocumentMarker* marker = list->at(marker_index).Get(); |
| 436 UpdateMarkerRenderedRectIfNeeded(node, *marker); | 426 UpdateMarkerRenderedRectIfNeeded(node, *marker); |
| 437 if (!marker->IsRendered()) | 427 if (!marker->IsRendered()) |
| 438 continue; | 428 continue; |
| 439 result.push_back(marker->RenderedRect()); | 429 result.push_back(marker->RenderedRect()); |
| 440 } | 430 } |
| 441 } | 431 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 if (iterator != markers_.end()) | 497 if (iterator != markers_.end()) |
| 508 RemoveMarkersFromList(iterator, marker_types); | 498 RemoveMarkersFromList(iterator, marker_types); |
| 509 } | 499 } |
| 510 | 500 |
| 511 void DocumentMarkerController::RemoveMarkers( | 501 void DocumentMarkerController::RemoveMarkers( |
| 512 const MarkerRemoverPredicate& should_remove_marker) { | 502 const MarkerRemoverPredicate& should_remove_marker) { |
| 513 for (auto& node_markers : markers_) { | 503 for (auto& node_markers : markers_) { |
| 514 const Node& node = *node_markers.key; | 504 const Node& node = *node_markers.key; |
| 515 if (!node.IsTextNode()) // MarkerRemoverPredicate requires a Text node. | 505 if (!node.IsTextNode()) // MarkerRemoverPredicate requires a Text node. |
| 516 continue; | 506 continue; |
| 517 MarkerLists& markers = *node_markers.value; | 507 MarkerLists* markers = node_markers.value; |
| 518 for (size_t marker_list_index = 0; | 508 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { |
| 519 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; | 509 Member<MarkerList>& list = ListForType(markers, type); |
| 520 ++marker_list_index) { | |
| 521 Member<MarkerList>& list = markers[marker_list_index]; | |
| 522 if (!list) | 510 if (!list) |
| 523 continue; | 511 continue; |
| 524 bool removed_markers = false; | 512 bool removed_markers = false; |
| 525 for (size_t j = list->size(); j > 0; --j) { | 513 for (size_t j = list->size(); j > 0; --j) { |
| 526 if (should_remove_marker(*list->at(j - 1), | 514 if (should_remove_marker(*list->at(j - 1), |
| 527 static_cast<const Text&>(node))) { | 515 static_cast<const Text&>(node))) { |
| 528 list->erase(j - 1); | 516 list->erase(j - 1); |
| 529 removed_markers = true; | 517 removed_markers = true; |
| 530 } | 518 } |
| 531 } | 519 } |
| 532 if (removed_markers && | 520 if (removed_markers && type == DocumentMarker::kTextMatch) |
| 533 marker_list_index == DocumentMarker::kTextMatchMarkerIndex) | |
| 534 InvalidatePaintForTickmarks(node); | 521 InvalidatePaintForTickmarks(node); |
| 535 } | 522 } |
| 536 } | 523 } |
| 537 } | 524 } |
| 538 | 525 |
| 539 void DocumentMarkerController::RemoveMarkers( | 526 void DocumentMarkerController::RemoveMarkers( |
| 540 DocumentMarker::MarkerTypes marker_types) { | 527 DocumentMarker::MarkerTypes marker_types) { |
| 541 if (!PossiblyHasMarkers(marker_types)) | 528 if (!PossiblyHasMarkers(marker_types)) |
| 542 return; | 529 return; |
| 543 DCHECK(!markers_.IsEmpty()); | 530 DCHECK(!markers_.IsEmpty()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 560 bool needs_repainting = false; | 547 bool needs_repainting = false; |
| 561 bool node_can_be_removed; | 548 bool node_can_be_removed; |
| 562 | 549 |
| 563 size_t empty_lists_count = 0; | 550 size_t empty_lists_count = 0; |
| 564 if (marker_types == DocumentMarker::AllMarkers()) { | 551 if (marker_types == DocumentMarker::AllMarkers()) { |
| 565 needs_repainting = true; | 552 needs_repainting = true; |
| 566 node_can_be_removed = true; | 553 node_can_be_removed = true; |
| 567 } else { | 554 } else { |
| 568 MarkerLists* markers = iterator->value.Get(); | 555 MarkerLists* markers = iterator->value.Get(); |
| 569 | 556 |
| 570 for (size_t marker_list_index = 0; | 557 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { |
| 571 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; | 558 Member<MarkerList>& list = ListForType(markers, type); |
| 572 ++marker_list_index) { | |
| 573 Member<MarkerList>& list = (*markers)[marker_list_index]; | |
| 574 if (!list || list->IsEmpty()) { | 559 if (!list || list->IsEmpty()) { |
| 575 if (list.Get() && list->IsEmpty()) | 560 if (list.Get() && list->IsEmpty()) |
| 576 list.Clear(); | 561 list.Clear(); |
| 577 ++empty_lists_count; | 562 ++empty_lists_count; |
| 578 continue; | 563 continue; |
| 579 } | 564 } |
| 580 if (marker_types.Contains((*list->begin())->GetType())) { | 565 if (marker_types.Contains(type)) { |
| 581 list->clear(); | 566 list->clear(); |
| 582 list.Clear(); | 567 list.Clear(); |
| 583 ++empty_lists_count; | 568 ++empty_lists_count; |
| 584 needs_repainting = true; | 569 needs_repainting = true; |
| 585 } | 570 } |
| 586 } | 571 } |
| 587 | 572 |
| 588 node_can_be_removed = | 573 node_can_be_removed = |
| 589 empty_lists_count == DocumentMarker::kMarkerTypeIndexesCount; | 574 empty_lists_count == DocumentMarker::kMarkerTypeIndexesCount; |
| 590 } | 575 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 611 return; | 596 return; |
| 612 DCHECK(!markers_.IsEmpty()); | 597 DCHECK(!markers_.IsEmpty()); |
| 613 | 598 |
| 614 // outer loop: process each markered node in the document | 599 // outer loop: process each markered node in the document |
| 615 MarkerMap::iterator end = markers_.end(); | 600 MarkerMap::iterator end = markers_.end(); |
| 616 for (MarkerMap::iterator i = markers_.begin(); i != end; ++i) { | 601 for (MarkerMap::iterator i = markers_.begin(); i != end; ++i) { |
| 617 const Node* node = i->key; | 602 const Node* node = i->key; |
| 618 | 603 |
| 619 // inner loop: process each marker in the current node | 604 // inner loop: process each marker in the current node |
| 620 MarkerLists* markers = i->value.Get(); | 605 MarkerLists* markers = i->value.Get(); |
| 621 for (size_t marker_list_index = 0; | 606 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { |
| 622 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; | 607 Member<MarkerList>& list = ListForType(markers, type); |
| 623 ++marker_list_index) { | 608 if (!list || list->IsEmpty() || !marker_types.Contains(type)) |
| 624 Member<MarkerList>& list = (*markers)[marker_list_index]; | |
| 625 if (!list || list->IsEmpty() || | |
| 626 !marker_types.Contains((*list->begin())->GetType())) | |
| 627 continue; | 609 continue; |
| 628 | 610 |
| 629 // cause the node to be redrawn | 611 // cause the node to be redrawn |
| 630 if (LayoutObject* layout_object = node->GetLayoutObject()) { | 612 if (LayoutObject* layout_object = node->GetLayoutObject()) { |
| 631 layout_object->SetShouldDoFullPaintInvalidation( | 613 layout_object->SetShouldDoFullPaintInvalidation( |
| 632 kPaintInvalidationDocumentMarkerChange); | 614 kPaintInvalidationDocumentMarkerChange); |
| 633 break; | 615 break; |
| 634 } | 616 } |
| 635 } | 617 } |
| 636 } | 618 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 | 682 |
| 701 #ifndef NDEBUG | 683 #ifndef NDEBUG |
| 702 void DocumentMarkerController::ShowMarkers() const { | 684 void DocumentMarkerController::ShowMarkers() const { |
| 703 StringBuilder builder; | 685 StringBuilder builder; |
| 704 MarkerMap::const_iterator end = markers_.end(); | 686 MarkerMap::const_iterator end = markers_.end(); |
| 705 for (MarkerMap::const_iterator node_iterator = markers_.begin(); | 687 for (MarkerMap::const_iterator node_iterator = markers_.begin(); |
| 706 node_iterator != end; ++node_iterator) { | 688 node_iterator != end; ++node_iterator) { |
| 707 const Node* node = node_iterator->key; | 689 const Node* node = node_iterator->key; |
| 708 builder.Append(String::Format("%p", node)); | 690 builder.Append(String::Format("%p", node)); |
| 709 MarkerLists* markers = markers_.at(node); | 691 MarkerLists* markers = markers_.at(node); |
| 710 for (size_t marker_list_index = 0; | 692 for (DocumentMarker::MarkerType type : DocumentMarker::AllMarkers()) { |
| 711 marker_list_index < DocumentMarker::kMarkerTypeIndexesCount; | 693 Member<MarkerList>& list = ListForType(markers, type); |
| 712 ++marker_list_index) { | |
| 713 Member<MarkerList>& list = (*markers)[marker_list_index]; | |
| 714 for (unsigned marker_index = 0; list.Get() && marker_index < list->size(); | 694 for (unsigned marker_index = 0; list.Get() && marker_index < list->size(); |
| 715 ++marker_index) { | 695 ++marker_index) { |
| 716 DocumentMarker* marker = list->at(marker_index).Get(); | 696 DocumentMarker* marker = list->at(marker_index).Get(); |
| 717 builder.Append(" "); | 697 builder.Append(" "); |
| 718 builder.AppendNumber(marker->GetType()); | 698 builder.AppendNumber(marker->GetType()); |
| 719 builder.Append(":["); | 699 builder.Append(":["); |
| 720 builder.AppendNumber(marker->StartOffset()); | 700 builder.AppendNumber(marker->StartOffset()); |
| 721 builder.Append(":"); | 701 builder.Append(":"); |
| 722 builder.AppendNumber(marker->EndOffset()); | 702 builder.AppendNumber(marker->EndOffset()); |
| 723 builder.Append("]("); | 703 builder.Append("]("); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 } | 745 } |
| 766 | 746 |
| 767 } // namespace blink | 747 } // namespace blink |
| 768 | 748 |
| 769 #ifndef NDEBUG | 749 #ifndef NDEBUG |
| 770 void showDocumentMarkers(const blink::DocumentMarkerController* controller) { | 750 void showDocumentMarkers(const blink::DocumentMarkerController* controller) { |
| 771 if (controller) | 751 if (controller) |
| 772 controller->ShowMarkers(); | 752 controller->ShowMarkers(); |
| 773 } | 753 } |
| 774 #endif | 754 #endif |
| OLD | NEW |