Changeset 204620 in webkit
- Timestamp:
- Aug 18, 2016 6:01:47 PM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r204619 r204620 1 2016-08-18 Jonathan Bedard <jbedard@apple.com> 2 3 Binding NULL pointer to reference in WebCore::RenderObject 4 https://bugs.webkit.org/show_bug.cgi?id=160830 5 6 Reviewed by Myles C. Maxfield. 7 8 No new tests needed, existing functionality not changed. 9 10 Fixes a dereferenced NULL pointer bound to a reference through a minor re-factor. 11 12 * rendering/InlineIterator.h: 13 (WebCore::InlineIterator::clear): Explicit clear occurs, instead of a call to moveTo. 14 (WebCore::InlineIterator::moveToStartOf): Swapped pointer for reference. 15 (WebCore::InlineIterator::moveTo): Swapped pointer for reference. 16 (WebCore::InlineIterator::increment): Explicitly call clear for clarity. 17 * rendering/line/BreakingContext.h: 18 (WebCore::BreakingContext::commitLineBreakClear): Commit a line break and clear the iterator. 19 (WebCore::BreakingContext::commitLineBreakAtCurrentWidth): Swapped pointer for reference. 20 (WebCore::BreakingContext::InlineIteratorHistory::moveTo): Swapped pointer for reference. 21 (WebCore::BreakingContext::increment): Explicitly call clear for clarity. 22 (WebCore::BreakingContext::handleBR): Swapped pointer for passed reference. 23 (WebCore::BreakingContext::handleReplaced): Explicitly call clear for clarity. 24 (WebCore::tryHyphenating): Swapped pointer for passed reference. 25 (WebCore::BreakingContext::handleText): Replaced all render object passing with references. Note that the caller explicitly checks if m_current.renderer() exists before calling this function. 26 (WebCore::BreakingContext::commitAndUpdateLineBreakIfNeeded): Explicitly call clear for clarity. 27 (WebCore::BreakingContext::handleEndOfLine): Explicitly call clear for clarity. 28 1 29 2016-08-18 Ryosuke Niwa <rniwa@webkit.org> 2 30 -
trunk/Source/WebCore/rendering/InlineIterator.h
r204531 r204620 65 65 } 66 66 67 void clear() { moveTo(nullptr, 0); } 68 69 void moveToStartOf(RenderObject* object) 67 void clear() 68 { 69 setRenderer(nullptr); 70 setOffset(0); 71 setNextBreakablePosition(-1); 72 } 73 void moveToStartOf(RenderObject& object) 70 74 { 71 75 moveTo(object, 0); 72 76 } 73 77 74 void moveTo(RenderObject * object, unsigned offset, Optional<unsigned> nextBreak = Nullopt)75 { 76 setRenderer( object);78 void moveTo(RenderObject& object, unsigned offset, Optional<unsigned> nextBreak = Optional<unsigned>()) 79 { 80 setRenderer(&object); 77 81 setOffset(offset); 78 82 setNextBreakablePosition(nextBreak); … … 398 402 return; 399 403 } 400 // bidiNext can return nullptr, so use moveTo instead of moveToStartOf 401 moveTo(bidiNextSkippingEmptyInlines(*m_root, m_renderer, resolver), 0); 404 // bidiNext can return nullptr 405 RenderObject* bidiNext = bidiNextSkippingEmptyInlines(*m_root, m_renderer, resolver); 406 if (bidiNext) 407 moveToStartOf(*bidiNext); 408 else 409 clear(); 402 410 } 403 411 -
trunk/Source/WebCore/rendering/line/BreakingContext.h
r204531 r204620 167 167 } 168 168 169 void commitLineBreak AtCurrentWidth(RenderObject& object, unsigned offset = 0, Optional<unsigned> nextBreak = Nullopt)169 void commitLineBreakClear() 170 170 { 171 171 m_width.commit(); 172 m_lineBreakHistory.moveTo(&object, offset, nextBreak); 172 m_lineBreakHistory.clear(); 173 m_hangsAtEnd = false; 174 } 175 176 void commitLineBreakAtCurrentWidth(RenderObject& object, unsigned offset = 0, Optional<unsigned> nextBreak = Optional<unsigned>()) 177 { 178 m_width.commit(); 179 m_lineBreakHistory.moveTo(object, offset, nextBreak); 173 180 m_hangsAtEnd = false; 174 181 } … … 211 218 size_t historyLength() const { return this->size(); } 212 219 213 void moveTo(RenderObject *object, unsigned offset, Optional<unsigned> nextBreak = Nullopt)220 void moveTo(RenderObject& object, unsigned offset, Optional<unsigned> nextBreak = Nullopt) 214 221 { 215 222 push([&](InlineIterator& modifyMe) { … … 327 334 m_currentCharacterIsSpace = false; 328 335 329 m_current.moveToStartOf(m_nextObject); 336 if (m_nextObject) 337 m_current.moveToStartOf(*m_nextObject); 338 else 339 m_current.clear(); 330 340 m_atStart = false; 331 341 } … … 336 346 RenderObject& br = *m_current.renderer(); 337 347 m_lineBreakHistory.push([&](InlineIterator& modifyMe) { 338 modifyMe.moveToStartOf( &br);348 modifyMe.moveToStartOf(br); 339 349 modifyMe.increment(); 340 350 }); … … 534 544 if (((m_autoWrap || RenderStyle::autoWrap(m_lastWS)) && (!m_current.renderer()->isImage() || m_allowImagesToBreak) 535 545 && (!m_current.renderer()->isRubyRun() || downcast<RenderRubyRun>(m_current.renderer())->canBreakBefore(m_renderTextInfo.lineBreakIterator))) || replacedBox.isAnonymousInlineBlock()) { 536 commitLineBreakAtCurrentWidth(*m_current.renderer()); 546 if (auto* renderer = m_current.renderer()) 547 commitLineBreakAtCurrentWidth(*renderer); 548 else 549 commitLineBreakClear(); 537 550 if (m_width.committedWidth() && replacedBox.isAnonymousInlineBlock()) { 538 551 // Always force a break before an anonymous inline block if there is content on the line … … 714 727 #endif 715 728 716 lineBreak.moveTo( &text, lastSpace + prefixLength, nextBreakable);729 lineBreak.moveTo(text, lastSpace + prefixLength, nextBreakable); 717 730 hyphenated = true; 718 731 } … … 750 763 m_appliedStartWidth = false; 751 764 752 RenderText& renderText = downcast<RenderText>(*m_current.renderer()); 765 RenderObject& renderObject = *m_current.renderer(); 766 RenderText& renderText = downcast<RenderText>(renderObject); 753 767 754 768 bool isSVGText = renderText.isSVGInlineText(); … … 932 946 lineWasTooWide = true; 933 947 m_lineBreakHistory.push([&](InlineIterator& modifyMe) { 934 modifyMe.moveTo( m_current.renderer(), m_current.offset(), m_current.nextBreakablePosition());948 modifyMe.moveTo(renderObject, m_current.offset(), m_current.nextBreakablePosition()); 935 949 m_lineBreaker.skipTrailingWhitespace(modifyMe, m_lineInfo); 936 950 }); … … 1009 1023 if (!stoppedIgnoringSpaces && m_current.offset()) 1010 1024 ensureCharacterGetsLineBox(m_lineWhitespaceCollapsingState, m_current); 1011 commitLineBreakAtCurrentWidth( *m_current.renderer(), m_current.offset(), m_current.nextBreakablePosition());1025 commitLineBreakAtCurrentWidth(renderObject, m_current.offset(), m_current.nextBreakablePosition()); 1012 1026 m_lineBreakHistory.increment(); 1013 1027 m_lineInfo.setPreviousLineBrokeCleanly(true); … … 1016 1030 1017 1031 if (m_autoWrap && betweenWords) { 1018 commitLineBreakAtCurrentWidth( *m_current.renderer(), m_current.offset(), m_current.nextBreakablePosition());1032 commitLineBreakAtCurrentWidth(renderObject, m_current.offset(), m_current.nextBreakablePosition()); 1019 1033 wrapW = 0; 1020 1034 // Auto-wrapping text should not wrap in the middle of a word once it has had an … … 1026 1040 // Remember this as a breakable position in case 1027 1041 // adding the end width forces a break. 1028 m_lineBreakHistory.moveTo( m_current.renderer(), m_current.offset(), m_current.nextBreakablePosition());1042 m_lineBreakHistory.moveTo(renderObject, m_current.offset(), m_current.nextBreakablePosition()); 1029 1043 midWordBreak &= (breakWords || breakAll); 1030 1044 } … … 1086 1100 if (!m_currentCharacterIsWS && previousCharacterIsWS) { 1087 1101 if (m_autoWrap && m_currentStyle->breakOnlyAfterWhiteSpace()) 1088 m_lineBreakHistory.moveTo( m_current.renderer(), m_current.offset(), m_current.nextBreakablePosition());1102 m_lineBreakHistory.moveTo(renderObject, m_current.offset(), m_current.nextBreakablePosition()); 1089 1103 } 1090 1104 … … 1224 1238 if (!m_current.renderer()->isFloatingOrOutOfFlowPositioned()) { 1225 1239 m_lastObject = m_current.renderer(); 1226 if (m_lastObject->isReplaced() && m_autoWrap && !m_lastObject->isRubyRun() && (!m_lastObject->isImage() || m_allowImagesToBreak) && (!is<RenderListMarker>(*m_lastObject) || downcast<RenderListMarker>(*m_lastObject).isInside())) 1227 commitLineBreakAtCurrentWidth(*m_nextObject); 1240 if (m_lastObject->isReplaced() && m_autoWrap && !m_lastObject->isRubyRun() && (!m_lastObject->isImage() || m_allowImagesToBreak) && (!is<RenderListMarker>(*m_lastObject) || downcast<RenderListMarker>(*m_lastObject).isInside())) { 1241 if (m_nextObject) 1242 commitLineBreakAtCurrentWidth(*m_nextObject); 1243 else 1244 commitLineBreakClear(); 1245 } 1228 1246 } 1229 1247 } … … 1258 1276 if (!m_lineBreakHistory.renderer() || !m_lineBreakHistory.renderer()->isBR()) { 1259 1277 // we just add as much as possible 1260 if (m_blockStyle.whiteSpace() == PRE && !m_current.offset()) 1261 commitLineBreakAtCurrentWidth(*m_lastObject, m_lastObject->isText() ? m_lastObject->length() : 0); 1278 if (m_blockStyle.whiteSpace() == PRE && !m_current.offset()) { 1279 if (m_lastObject) 1280 commitLineBreakAtCurrentWidth(*m_lastObject, m_lastObject->isText() ? m_lastObject->length() : 0); 1281 else 1282 commitLineBreakClear(); 1283 } 1262 1284 else if (m_lineBreakHistory.renderer()) { 1263 1285 // Don't ever break in the middle of a word if we can help it.
Note: See TracChangeset
for help on using the changeset viewer.