Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: Source/WebCore/rendering/RenderFlowThread.cpp

Issue 9129033: Merge 104121 - Source/WebCore: Crash in RenderRegion::getRegionRangeForBox. (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/963/
Patch Set: Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/WebCore/rendering/RenderFlowThread.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Adobe Systems Incorporated. All Rights Reserved. 2 * Copyright 2011 Adobe Systems Incorporated. All Rights Reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above 8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following 9 * copyright notice, this list of conditions and the following
10 * disclaimer. 10 * disclaimer.
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 } 202 }
203 203
204 renderRegion->setIsValid(true); 204 renderRegion->setIsValid(true);
205 205
206 invalidateRegions(); 206 invalidateRegions();
207 } 207 }
208 208
209 void RenderFlowThread::removeRegionFromThread(RenderRegion* renderRegion) 209 void RenderFlowThread::removeRegionFromThread(RenderRegion* renderRegion)
210 { 210 {
211 ASSERT(renderRegion); 211 ASSERT(renderRegion);
212 clearRenderRegionRangeMap();
212 m_regionList.remove(renderRegion); 213 m_regionList.remove(renderRegion);
214
213 if (renderRegion->parentFlowThread()) { 215 if (renderRegion->parentFlowThread()) {
214 if (!renderRegion->isValid()) { 216 if (!renderRegion->isValid()) {
215 renderRegion->parentFlowThread()->m_observerThreadsSet.remove(this); 217 renderRegion->parentFlowThread()->m_observerThreadsSet.remove(this);
216 // No need to invalidate the regions rectangles. The removed region 218 // No need to invalidate the regions rectangles. The removed region
217 // was not taken into account. Just return here. 219 // was not taken into account. Just return here.
218 return; 220 return;
219 } 221 }
220 removeDependencyOnFlowThread(renderRegion->parentFlowThread()); 222 removeDependencyOnFlowThread(renderRegion->parentFlowThread());
221 } 223 }
222 224
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 bool RenderFlowThread::shouldRepaint(const LayoutRect& r) const 494 bool RenderFlowThread::shouldRepaint(const LayoutRect& r) const
493 { 495 {
494 if (view()->printing() || r.isEmpty()) 496 if (view()->printing() || r.isEmpty())
495 return false; 497 return false;
496 498
497 return true; 499 return true;
498 } 500 }
499 501
500 void RenderFlowThread::repaintRectangleInRegions(const LayoutRect& repaintRect, bool immediate) 502 void RenderFlowThread::repaintRectangleInRegions(const LayoutRect& repaintRect, bool immediate)
501 { 503 {
502 if (!shouldRepaint(repaintRect)) 504 if (!shouldRepaint(repaintRect) || !hasValidRegionInfo())
503 return; 505 return;
504 506
505 for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regio nList.end(); ++iter) { 507 for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regio nList.end(); ++iter) {
506 RenderRegion* region = *iter; 508 RenderRegion* region = *iter;
507 if (!region->isValid()) 509 if (!region->isValid())
508 continue; 510 continue;
509 511
510 // We only have to issue a repaint in this region if the region rect int ersects the repaint rect. 512 // We only have to issue a repaint in this region if the region rect int ersects the repaint rect.
511 LayoutRect flippedRegionRect(region->regionRect()); 513 LayoutRect flippedRegionRect(region->regionRect());
512 LayoutRect flippedRegionOverflowRect(region->regionOverflowRect()); 514 LayoutRect flippedRegionOverflowRect(region->regionOverflowRect());
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 // If IncludePageBoundary is set, the line exactly on the top edge of a 588 // If IncludePageBoundary is set, the line exactly on the top edge of a
587 // region will act as being part of the previous region. 589 // region will act as being part of the previous region.
588 LayoutUnit regionHeight = isHorizontalWritingMode() ? region->regionRect ().height() : region->regionRect().width(); 590 LayoutUnit regionHeight = isHorizontalWritingMode() ? region->regionRect ().height() : region->regionRect().width();
589 remainingHeight = layoutMod(remainingHeight, regionHeight); 591 remainingHeight = layoutMod(remainingHeight, regionHeight);
590 } 592 }
591 return remainingHeight; 593 return remainingHeight;
592 } 594 }
593 595
594 RenderRegion* RenderFlowThread::mapFromFlowToRegion(TransformState& transformSta te) const 596 RenderRegion* RenderFlowThread::mapFromFlowToRegion(TransformState& transformSta te) const
595 { 597 {
596 if (!hasValidRegions()) 598 if (!hasValidRegionInfo())
597 return 0; 599 return 0;
598 600
599 LayoutRect boxRect = transformState.mappedQuad().enclosingBoundingBox(); 601 LayoutRect boxRect = transformState.mappedQuad().enclosingBoundingBox();
600 flipForWritingMode(boxRect); 602 flipForWritingMode(boxRect);
601 603
602 // FIXME: We need to refactor RenderObject::absoluteQuads to be able to spli t the quads across regions, 604 // FIXME: We need to refactor RenderObject::absoluteQuads to be able to spli t the quads across regions,
603 // for now we just take the center of the mapped enclosing box and map it to a region. 605 // for now we just take the center of the mapped enclosing box and map it to a region.
604 // Note: Using the center in order to avoid rounding errors. 606 // Note: Using the center in order to avoid rounding errors.
605 607
606 LayoutPoint center = boxRect.center(); 608 LayoutPoint center = boxRect.center();
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 669
668 if (region == endRegion) 670 if (region == endRegion)
669 break; 671 break;
670 } 672 }
671 673
672 return false; 674 return false;
673 } 675 }
674 676
675 LayoutUnit RenderFlowThread::contentLogicalWidthOfFirstRegion() const 677 LayoutUnit RenderFlowThread::contentLogicalWidthOfFirstRegion() const
676 { 678 {
677 if (!hasValidRegions()) 679 if (!hasValidRegionInfo())
678 return 0; 680 return 0;
679 for (RenderRegionList::const_iterator iter = m_regionList.begin(); iter != m _regionList.end(); ++iter) { 681 for (RenderRegionList::const_iterator iter = m_regionList.begin(); iter != m _regionList.end(); ++iter) {
680 RenderRegion* region = *iter; 682 RenderRegion* region = *iter;
681 if (!region->isValid()) 683 if (!region->isValid())
682 continue; 684 continue;
683 return isHorizontalWritingMode() ? region->contentWidth() : region->cont entHeight(); 685 return isHorizontalWritingMode() ? region->contentWidth() : region->cont entHeight();
684 } 686 }
685 ASSERT_NOT_REACHED(); 687 ASSERT_NOT_REACHED();
686 return 0; 688 return 0;
687 } 689 }
688 690
689 LayoutUnit RenderFlowThread::contentLogicalHeightOfFirstRegion() const 691 LayoutUnit RenderFlowThread::contentLogicalHeightOfFirstRegion() const
690 { 692 {
691 if (!hasValidRegions()) 693 if (!hasValidRegionInfo())
692 return 0; 694 return 0;
693 for (RenderRegionList::const_iterator iter = m_regionList.begin(); iter != m _regionList.end(); ++iter) { 695 for (RenderRegionList::const_iterator iter = m_regionList.begin(); iter != m _regionList.end(); ++iter) {
694 RenderRegion* region = *iter; 696 RenderRegion* region = *iter;
695 if (!region->isValid()) 697 if (!region->isValid())
696 continue; 698 continue;
697 return isHorizontalWritingMode() ? region->contentHeight() : region->con tentWidth(); 699 return isHorizontalWritingMode() ? region->contentHeight() : region->con tentWidth();
698 } 700 }
699 ASSERT_NOT_REACHED(); 701 ASSERT_NOT_REACHED();
700 return 0; 702 return 0;
701 } 703 }
702 704
703 LayoutUnit RenderFlowThread::contentLogicalLeftOfFirstRegion() const 705 LayoutUnit RenderFlowThread::contentLogicalLeftOfFirstRegion() const
704 { 706 {
705 if (!hasValidRegions()) 707 if (!hasValidRegionInfo())
706 return 0; 708 return 0;
707 for (RenderRegionList::const_iterator iter = m_regionList.begin(); iter != m _regionList.end(); ++iter) { 709 for (RenderRegionList::const_iterator iter = m_regionList.begin(); iter != m _regionList.end(); ++iter) {
708 RenderRegion* region = *iter; 710 RenderRegion* region = *iter;
709 if (!region->isValid()) 711 if (!region->isValid())
710 continue; 712 continue;
711 return isHorizontalWritingMode() ? region->regionRect().x() : region->re gionRect().y(); 713 return isHorizontalWritingMode() ? region->regionRect().x() : region->re gionRect().y();
712 } 714 }
713 ASSERT_NOT_REACHED(); 715 ASSERT_NOT_REACHED();
714 return 0; 716 return 0;
715 } 717 }
716 718
717 RenderRegion* RenderFlowThread::firstRegion() const 719 RenderRegion* RenderFlowThread::firstRegion() const
718 { 720 {
719 if (!hasValidRegions()) 721 if (!hasValidRegionInfo())
720 return 0; 722 return 0;
721 for (RenderRegionList::const_iterator iter = m_regionList.begin(); iter != m _regionList.end(); ++iter) { 723 for (RenderRegionList::const_iterator iter = m_regionList.begin(); iter != m _regionList.end(); ++iter) {
722 RenderRegion* region = *iter; 724 RenderRegion* region = *iter;
723 if (!region->isValid()) 725 if (!region->isValid())
724 continue; 726 continue;
725 return region; 727 return region;
726 } 728 }
727 return 0; 729 return 0;
728 } 730 }
729 731
730 RenderRegion* RenderFlowThread::lastRegion() const 732 RenderRegion* RenderFlowThread::lastRegion() const
731 { 733 {
732 if (!hasValidRegions()) 734 if (!hasValidRegionInfo())
733 return 0; 735 return 0;
734 for (RenderRegionList::const_reverse_iterator iter = m_regionList.rbegin(); iter != m_regionList.rend(); ++iter) { 736 for (RenderRegionList::const_reverse_iterator iter = m_regionList.rbegin(); iter != m_regionList.rend(); ++iter) {
735 RenderRegion* region = *iter; 737 RenderRegion* region = *iter;
736 if (!region->isValid()) 738 if (!region->isValid())
737 continue; 739 continue;
738 return region; 740 return region;
739 } 741 }
740 return 0; 742 return 0;
741 } 743 }
742 744
(...skipping 29 matching lines...) Expand all
772 m_regionRangeMap.set(box, range); 774 m_regionRangeMap.set(box, range);
773 } 775 }
774 776
775 void RenderFlowThread::getRegionRangeForBox(const RenderBox* box, RenderRegion*& startRegion, RenderRegion*& endRegion) const 777 void RenderFlowThread::getRegionRangeForBox(const RenderBox* box, RenderRegion*& startRegion, RenderRegion*& endRegion) const
776 { 778 {
777 startRegion = 0; 779 startRegion = 0;
778 endRegion = 0; 780 endRegion = 0;
779 RenderRegionRange* range = m_regionRangeMap.get(box); 781 RenderRegionRange* range = m_regionRangeMap.get(box);
780 if (!range) 782 if (!range)
781 return; 783 return;
784
782 startRegion = range->startRegion(); 785 startRegion = range->startRegion();
783 endRegion = range->endRegion(); 786 endRegion = range->endRegion();
787 ASSERT(m_regionList.contains(startRegion) && m_regionList.contains(endRegion ));
784 } 788 }
785 789
786 } // namespace WebCore 790 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/WebCore/rendering/RenderFlowThread.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698