Changeset 149654 in webkit
- Timestamp:
- May 6, 2013 5:45:31 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r149653 r149654 1 2013-05-06 Darin Adler <darin@apple.com> 2 3 Use OwnPtr instead of deleteAllValues in DocumentMarkerController 4 https://bugs.webkit.org/show_bug.cgi?id=115655 5 6 Reviewed by Andreas Kling. 7 8 * dom/DocumentMarkerController.cpp: 9 (WebCore::DocumentMarkerController::~DocumentMarkerController): Added here 10 so the destructor isn't implicitly inline. 11 (WebCore::DocumentMarkerController::detach): Removed now-unneeded code to 12 call deleteAllValues. Also moved code to set m_possiblyExistingMarkerTypes 13 to after clearing m_markers to be consistent with how other functions do it. 14 (WebCore::DocumentMarkerController::addMarker): Changed code to use the 15 add idiom to avoid double hash table lookup. Changed to use adoptPtr since 16 the map now contains OwnPtr. 17 (WebCore::DocumentMarkerController::removeMarkers): Removed explicit calls 18 to delete list since removing the entry from the map now deletes the list. 19 Moved the code to check if m_markers has become empty so it's only called 20 when we actually remove something from m_markers. 21 (WebCore::DocumentMarkerController::markerContainingPoint): Added get(). 22 (WebCore::DocumentMarkerController::renderedRectsForMarkers): Added get(). 23 (WebCore::DocumentMarkerController::removeMarkers): Changed to use a new 24 interface to removeMarkersFromList. This eliminated the need to copy the 25 entire map when removing markers; instead we can just copy the keys. 26 (WebCore::DocumentMarkerController::removeMarkersFromList): Changed to use 27 an iterator instead of being passed the key/value pair from the map. Also 28 rearranged the logic so there is less repeated code and removed some now- 29 unneeded comments. 30 (WebCore::DocumentMarkerController::repaintMarkers): Added get(). 31 (WebCore::DocumentMarkerController::invalidateRenderedRectsForMarkersInRect): 32 Added get(). 33 (WebCore::DocumentMarkerController::showMarkers): Added get(). 34 35 * dom/DocumentMarkerController.h: Removed implementation of the destructor 36 that called the detach function; that was just sharing the now-unneeded 37 call to deleteAllValues. Changed the type of the map to use an OwnPtr for 38 the value. Changed the interface of removeMarkersFromList to take a map 39 iterator instead of a key/value pair. 40 1 41 2013-05-06 Beth Dakin <bdakin@apple.com> 2 42 -
trunk/Source/WebCore/dom/DocumentMarkerController.cpp
r141877 r149654 34 34 #include "RenderedDocumentMarker.h" 35 35 #include "TextIterator.h" 36 37 #ifndef NDEBUG38 36 #include <stdio.h> 39 #endif40 37 41 38 namespace WebCore { … … 51 48 } 52 49 50 DocumentMarkerController::~DocumentMarkerController() 51 { 52 } 53 53 54 void DocumentMarkerController::detach() 54 55 { 56 m_markers.clear(); 55 57 m_possiblyExistingMarkerTypes = 0; 56 if (m_markers.isEmpty())57 return;58 deleteAllValues(m_markers);59 m_markers.clear();60 58 } 61 59 … … 135 133 m_possiblyExistingMarkerTypes.add(newMarker.type()); 136 134 137 MarkerList* list = m_markers.get(node);135 OwnPtr<MarkerList>& list = m_markers.add(node, nullptr).iterator->value; 138 136 139 137 if (!list) { 140 list = new MarkerList;138 list = adoptPtr(new MarkerList); 141 139 list->append(RenderedDocumentMarker(newMarker)); 142 m_markers.set(node, list);143 140 } else { 144 141 RenderedDocumentMarker toInsert(newMarker); … … 287 284 if (list->isEmpty()) { 288 285 m_markers.remove(node); 289 delete list; 290 } 291 292 if (m_markers.isEmpty()) 293 m_possiblyExistingMarkerTypes = 0; 286 if (m_markers.isEmpty()) 287 m_possiblyExistingMarkerTypes = 0; 288 } 294 289 295 290 // repaint the affected node … … 308 303 for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != end; ++nodeIterator) { 309 304 // inner loop; process each marker in this node 310 MarkerList* list = nodeIterator->value ;305 MarkerList* list = nodeIterator->value.get(); 311 306 unsigned markerCount = list->size(); 312 307 for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex) { … … 396 391 for (MarkerMap::iterator nodeIterator = m_markers.begin(); nodeIterator != end; ++nodeIterator) { 397 392 // inner loop; process each marker in this node 398 MarkerList* list = nodeIterator->value ;393 MarkerList* list = nodeIterator->value.get(); 399 394 unsigned markerCount = list->size(); 400 395 for (unsigned markerIndex = 0; markerIndex < markerCount; ++markerIndex) { … … 423 418 MarkerMap::iterator iterator = m_markers.find(node); 424 419 if (iterator != m_markers.end()) 425 removeMarkersFromList( node, iterator->value, markerTypes);420 removeMarkersFromList(iterator, markerTypes); 426 421 } 427 422 … … 432 427 ASSERT(!m_markers.isEmpty()); 433 428 434 // outer loop: process each markered node in the document 435 MarkerMap markerMapCopy = m_markers; 436 MarkerMap::iterator end = markerMapCopy.end(); 437 for (MarkerMap::iterator i = markerMapCopy.begin(); i != end; ++i) 438 removeMarkersFromList(i->key.get(), i->value, markerTypes); 429 Vector<RefPtr<Node> > nodesWithMarkers; 430 copyKeysToVector(m_markers, nodesWithMarkers); 431 unsigned size = nodesWithMarkers.size(); 432 for (unsigned i = 0; i < size; ++i) { 433 MarkerMap::iterator iterator = m_markers.find(nodesWithMarkers[i]); 434 if (iterator != m_markers.end()) 435 removeMarkersFromList(iterator, markerTypes); 436 } 437 439 438 m_possiblyExistingMarkerTypes.remove(markerTypes); 440 439 } 441 440 442 // This function may release node and vectorPair. 443 void DocumentMarkerController::removeMarkersFromList(Node* node, MarkerList* list, DocumentMarker::MarkerTypes markerTypes) 444 { 441 void DocumentMarkerController::removeMarkersFromList(MarkerMap::iterator iterator, DocumentMarker::MarkerTypes markerTypes) 442 { 443 bool needsRepainting = false; 444 bool listCanBeRemoved; 445 445 446 if (markerTypes == DocumentMarker::AllMarkers()) { 446 delete list; 447 m_markers.remove(node); 448 if (RenderObject* renderer = node->renderer()) 449 renderer->repaint(); 447 needsRepainting = true; 448 listCanBeRemoved = true; 450 449 } else { 451 bool needsRepaint = false; 452 for (size_t i = 0; i != list->size();) { 450 MarkerList* list = iterator->value.get(); 451 452 for (size_t i = 0; i != list->size(); ) { 453 453 DocumentMarker marker = list->at(i); 454 454 … … 461 461 // pitch the old marker 462 462 list->remove(i); 463 needsRepaint = true;463 needsRepainting = true; 464 464 // i now is the index of the next marker 465 465 } 466 466 467 // Redraw the node if it changed. Do this before the node is removed from m_markers, since 468 // m_markers might contain the last reference to the node. 469 if (needsRepaint) { 470 RenderObject* renderer = node->renderer(); 471 if (renderer) 472 renderer->repaint(); 473 } 474 475 // delete the node's list if it is now empty 476 if (list->isEmpty()) { 477 m_markers.remove(node); 478 delete list; 479 } 480 } 481 if (m_markers.isEmpty()) 482 m_possiblyExistingMarkerTypes = 0; 467 listCanBeRemoved = list->isEmpty(); 468 } 469 470 if (needsRepainting) { 471 if (RenderObject* renderer = iterator->key->renderer()) 472 renderer->repaint(); 473 } 474 475 if (listCanBeRemoved) { 476 m_markers.remove(iterator); 477 if (m_markers.isEmpty()) 478 m_possiblyExistingMarkerTypes = 0; 479 } 483 480 } 484 481 … … 495 492 496 493 // inner loop: process each marker in the current node 497 MarkerList* list = i->value ;494 MarkerList* list = i->value.get(); 498 495 bool nodeNeedsRepaint = false; 499 496 for (size_t i = 0; i != list->size(); ++i) { … … 523 520 524 521 // inner loop: process each rect in the current node 525 MarkerList* list = i->value ;522 MarkerList* list = i->value.get(); 526 523 for (size_t listIndex = 0; listIndex < list->size(); ++listIndex) 527 524 list->at(listIndex).invalidate(r); … … 674 671 Node* node = nodeIterator->key.get(); 675 672 fprintf(stderr, "%p", node); 676 MarkerList* list = nodeIterator->value ;673 MarkerList* list = nodeIterator->value.get(); 677 674 for (unsigned markerIndex = 0; markerIndex < list->size(); ++markerIndex) { 678 675 const DocumentMarker& marker = list->at(markerIndex); … … 687 684 } // namespace WebCore 688 685 689 690 686 #ifndef NDEBUG 691 687 void showDocumentMarkers(const WebCore::DocumentMarkerController* controller) -
trunk/Source/WebCore/dom/DocumentMarkerController.h
r133779 r149654 46 46 47 47 DocumentMarkerController(); 48 ~DocumentMarkerController() { detach(); }48 ~DocumentMarkerController(); 49 49 50 50 void detach(); … … 88 88 89 89 typedef Vector<RenderedDocumentMarker> MarkerList; 90 typedef HashMap<RefPtr<Node>, MarkerList*> MarkerMap;90 typedef HashMap<RefPtr<Node>, OwnPtr<MarkerList> > MarkerMap; 91 91 bool possiblyHasMarkers(DocumentMarker::MarkerTypes); 92 void removeMarkersFromList( Node*, MarkerList*, DocumentMarker::MarkerTypes);92 void removeMarkersFromList(MarkerMap::iterator, DocumentMarker::MarkerTypes); 93 93 94 94 MarkerMap m_markers;
Note: See TracChangeset
for help on using the changeset viewer.