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

Side by Side Diff: Source/core/layout/line/RootInlineBox.cpp

Issue 899163003: Move rendering/RenderObject to layout/LayoutObject. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/layout/line/RootInlineBox.h ('k') | Source/core/layout/line/TrailingObjects.h » ('j') | 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 (C) 2003, 2006, 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved.
3 * 3 *
4 * This library is free software; you can redistribute it and/or 4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public 5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either 6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version. 7 * version 2 of the License, or (at your option) any later version.
8 * 8 *
9 * This library is distributed in the hope that it will be useful, 9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 // We have to compute the expansion for annotations over the previous li ne to see how much we should move. 275 // We have to compute the expansion for annotations over the previous li ne to see how much we should move.
276 LayoutUnit lowestAllowedPosition = std::max(prevRootBox()->lineBottom(), lineTop()) - result; 276 LayoutUnit lowestAllowedPosition = std::max(prevRootBox()->lineBottom(), lineTop()) - result;
277 result = prevRootBox()->computeOverAnnotationAdjustment(lowestAllowedPos ition); 277 result = prevRootBox()->computeOverAnnotationAdjustment(lowestAllowedPos ition);
278 } 278 }
279 279
280 return result; 280 return result;
281 } 281 }
282 282
283 GapRects RootInlineBox::lineSelectionGap(const RenderBlock* rootBlock, const Lay outPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, Layo utUnit selTop, LayoutUnit selHeight, const PaintInfo* paintInfo) const 283 GapRects RootInlineBox::lineSelectionGap(const RenderBlock* rootBlock, const Lay outPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, Layo utUnit selTop, LayoutUnit selHeight, const PaintInfo* paintInfo) const
284 { 284 {
285 RenderObject::SelectionState lineState = selectionState(); 285 LayoutObject::SelectionState lineState = selectionState();
286 286
287 bool leftGap, rightGap; 287 bool leftGap, rightGap;
288 block().getSelectionGapInfo(lineState, leftGap, rightGap); 288 block().getSelectionGapInfo(lineState, leftGap, rightGap);
289 289
290 GapRects result; 290 GapRects result;
291 291
292 InlineBox* firstBox = firstSelectedBox(); 292 InlineBox* firstBox = firstSelectedBox();
293 InlineBox* lastBox = lastSelectedBox(); 293 InlineBox* lastBox = lastSelectedBox();
294 if (leftGap) { 294 if (leftGap) {
295 result.uniteLeft(block().logicalLeftSelectionGap(rootBlock, rootBlockPhy sicalPosition, offsetFromRootBlock, 295 result.uniteLeft(block().logicalLeftSelectionGap(rootBlock, rootBlockPhy sicalPosition, offsetFromRootBlock,
296 &firstBox->parent()->renderer(), firstBox->logicalLeft(), selTop, se lHeight, paintInfo)); 296 &firstBox->parent()->renderer(), firstBox->logicalLeft(), selTop, se lHeight, paintInfo));
297 } 297 }
298 if (rightGap) { 298 if (rightGap) {
299 result.uniteRight(block().logicalRightSelectionGap(rootBlock, rootBlockP hysicalPosition, offsetFromRootBlock, 299 result.uniteRight(block().logicalRightSelectionGap(rootBlock, rootBlockP hysicalPosition, offsetFromRootBlock,
300 &lastBox->parent()->renderer(), lastBox->logicalRight(), selTop, sel Height, paintInfo)); 300 &lastBox->parent()->renderer(), lastBox->logicalRight(), selTop, sel Height, paintInfo));
301 } 301 }
302 302
303 // When dealing with bidi text, a non-contiguous selection region is possibl e. 303 // When dealing with bidi text, a non-contiguous selection region is possibl e.
304 // e.g. The logical text aaaAAAbbb (capitals denote RTL text and non-capital s LTR) is layed out 304 // e.g. The logical text aaaAAAbbb (capitals denote RTL text and non-capital s LTR) is layed out
305 // visually as 3 text runs |aaa|bbb|AAA| if we select 4 characters from the start of the text the 305 // visually as 3 text runs |aaa|bbb|AAA| if we select 4 characters from the start of the text the
306 // selection will look like (underline denotes selection): 306 // selection will look like (underline denotes selection):
307 // |aaa|bbb|AAA| 307 // |aaa|bbb|AAA|
308 // ___ _ 308 // ___ _
309 // We can see that the |bbb| run is not part of the selection while the runs around it are. 309 // We can see that the |bbb| run is not part of the selection while the runs around it are.
310 if (firstBox && firstBox != lastBox) { 310 if (firstBox && firstBox != lastBox) {
311 // Now fill in any gaps on the line that occurred between two selected e lements. 311 // Now fill in any gaps on the line that occurred between two selected e lements.
312 LayoutUnit lastLogicalLeft = firstBox->logicalRight(); 312 LayoutUnit lastLogicalLeft = firstBox->logicalRight();
313 bool isPreviousBoxSelected = firstBox->selectionState() != RenderObject: :SelectionNone; 313 bool isPreviousBoxSelected = firstBox->selectionState() != LayoutObject: :SelectionNone;
314 for (InlineBox* box = firstBox->nextLeafChild(); box; box = box->nextLea fChild()) { 314 for (InlineBox* box = firstBox->nextLeafChild(); box; box = box->nextLea fChild()) {
315 if (box->selectionState() != RenderObject::SelectionNone) { 315 if (box->selectionState() != LayoutObject::SelectionNone) {
316 LayoutRect logicalRect(lastLogicalLeft, selTop, box->logicalLeft () - lastLogicalLeft, selHeight); 316 LayoutRect logicalRect(lastLogicalLeft, selTop, box->logicalLeft () - lastLogicalLeft, selHeight);
317 logicalRect.move(renderer().isHorizontalWritingMode() ? offsetFr omRootBlock : LayoutSize(offsetFromRootBlock.height(), offsetFromRootBlock.width ())); 317 logicalRect.move(renderer().isHorizontalWritingMode() ? offsetFr omRootBlock : LayoutSize(offsetFromRootBlock.height(), offsetFromRootBlock.width ()));
318 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBl ockPhysicalPosition, logicalRect); 318 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBl ockPhysicalPosition, logicalRect);
319 if (isPreviousBoxSelected && gapRect.width() > 0 && gapRect.heig ht() > 0) { 319 if (isPreviousBoxSelected && gapRect.width() > 0 && gapRect.heig ht() > 0) {
320 if (paintInfo && box->parent()->renderer().style()->visibili ty() == VISIBLE) 320 if (paintInfo && box->parent()->renderer().style()->visibili ty() == VISIBLE)
321 paintInfo->context->fillRect(gapRect, box->parent()->ren derer().selectionBackgroundColor()); 321 paintInfo->context->fillRect(gapRect, box->parent()->ren derer().selectionBackgroundColor());
322 // VisibleSelection may be non-contiguous, see comment above . 322 // VisibleSelection may be non-contiguous, see comment above .
323 result.uniteCenter(gapRect); 323 result.uniteCenter(gapRect);
324 } 324 }
325 lastLogicalLeft = box->logicalRight(); 325 lastLogicalLeft = box->logicalRight();
326 } 326 }
327 if (box == lastBox) 327 if (box == lastBox)
328 break; 328 break;
329 isPreviousBoxSelected = box->selectionState() != RenderObject::Selec tionNone; 329 isPreviousBoxSelected = box->selectionState() != LayoutObject::Selec tionNone;
330 } 330 }
331 } 331 }
332 332
333 return result; 333 return result;
334 } 334 }
335 335
336 RenderObject::SelectionState RootInlineBox::selectionState() const 336 LayoutObject::SelectionState RootInlineBox::selectionState() const
337 { 337 {
338 // Walk over all of the selected boxes. 338 // Walk over all of the selected boxes.
339 RenderObject::SelectionState state = RenderObject::SelectionNone; 339 LayoutObject::SelectionState state = LayoutObject::SelectionNone;
340 for (InlineBox* box = firstLeafChild(); box; box = box->nextLeafChild()) { 340 for (InlineBox* box = firstLeafChild(); box; box = box->nextLeafChild()) {
341 RenderObject::SelectionState boxState = box->selectionState(); 341 LayoutObject::SelectionState boxState = box->selectionState();
342 if ((boxState == RenderObject::SelectionStart && state == RenderObject:: SelectionEnd) 342 if ((boxState == LayoutObject::SelectionStart && state == LayoutObject:: SelectionEnd)
343 || (boxState == RenderObject::SelectionEnd && state == RenderObject: :SelectionStart)) { 343 || (boxState == LayoutObject::SelectionEnd && state == LayoutObject: :SelectionStart)) {
344 state = RenderObject::SelectionBoth; 344 state = LayoutObject::SelectionBoth;
345 } else if (state == RenderObject::SelectionNone || ((boxState == RenderO bject::SelectionStart || boxState == RenderObject::SelectionEnd) && (state == Re nderObject::SelectionNone || state == RenderObject::SelectionInside))) { 345 } else if (state == LayoutObject::SelectionNone || ((boxState == LayoutO bject::SelectionStart || boxState == LayoutObject::SelectionEnd) && (state == La youtObject::SelectionNone || state == LayoutObject::SelectionInside))) {
346 state = boxState; 346 state = boxState;
347 } else if (boxState == RenderObject::SelectionNone && state == RenderObj ect::SelectionStart) { 347 } else if (boxState == LayoutObject::SelectionNone && state == LayoutObj ect::SelectionStart) {
348 // We are past the end of the selection. 348 // We are past the end of the selection.
349 state = RenderObject::SelectionBoth; 349 state = LayoutObject::SelectionBoth;
350 } 350 }
351 if (state == RenderObject::SelectionBoth) 351 if (state == LayoutObject::SelectionBoth)
352 break; 352 break;
353 } 353 }
354 354
355 return state; 355 return state;
356 } 356 }
357 357
358 InlineBox* RootInlineBox::firstSelectedBox() const 358 InlineBox* RootInlineBox::firstSelectedBox() const
359 { 359 {
360 for (InlineBox* box = firstLeafChild(); box; box = box->nextLeafChild()) { 360 for (InlineBox* box = firstLeafChild(); box; box = box->nextLeafChild()) {
361 if (box->selectionState() != RenderObject::SelectionNone) 361 if (box->selectionState() != LayoutObject::SelectionNone)
362 return box; 362 return box;
363 } 363 }
364 364
365 return 0; 365 return 0;
366 } 366 }
367 367
368 InlineBox* RootInlineBox::lastSelectedBox() const 368 InlineBox* RootInlineBox::lastSelectedBox() const
369 { 369 {
370 for (InlineBox* box = lastLeafChild(); box; box = box->prevLeafChild()) { 370 for (InlineBox* box = lastLeafChild(); box; box = box->prevLeafChild()) {
371 if (box->selectionState() != RenderObject::SelectionNone) 371 if (box->selectionState() != LayoutObject::SelectionNone)
372 return box; 372 return box;
373 } 373 }
374 374
375 return 0; 375 return 0;
376 } 376 }
377 377
378 LayoutUnit RootInlineBox::selectionTop() const 378 LayoutUnit RootInlineBox::selectionTop() const
379 { 379 {
380 LayoutUnit selectionTop = m_lineTop; 380 LayoutUnit selectionTop = m_lineTop;
381 381
(...skipping 16 matching lines...) Expand all
398 return selectionTop; 398 return selectionTop;
399 } 399 }
400 400
401 return prevBottom; 401 return prevBottom;
402 } 402 }
403 403
404 LayoutUnit RootInlineBox::selectionTopAdjustedForPrecedingBlock() const 404 LayoutUnit RootInlineBox::selectionTopAdjustedForPrecedingBlock() const
405 { 405 {
406 LayoutUnit top = selectionTop(); 406 LayoutUnit top = selectionTop();
407 407
408 RenderObject::SelectionState blockSelectionState = root().block().selectionS tate(); 408 LayoutObject::SelectionState blockSelectionState = root().block().selectionS tate();
409 if (blockSelectionState != RenderObject::SelectionInside && blockSelectionSt ate != RenderObject::SelectionEnd) 409 if (blockSelectionState != LayoutObject::SelectionInside && blockSelectionSt ate != LayoutObject::SelectionEnd)
410 return top; 410 return top;
411 411
412 LayoutSize offsetToBlockBefore; 412 LayoutSize offsetToBlockBefore;
413 if (RenderBlock* block = root().block().blockBeforeWithinSelectionRoot(offse tToBlockBefore)) { 413 if (RenderBlock* block = root().block().blockBeforeWithinSelectionRoot(offse tToBlockBefore)) {
414 if (block->isRenderBlockFlow()) { 414 if (block->isRenderBlockFlow()) {
415 if (RootInlineBox* lastLine = toRenderBlockFlow(block)->lastRootBox( )) { 415 if (RootInlineBox* lastLine = toRenderBlockFlow(block)->lastRootBox( )) {
416 RenderObject::SelectionState lastLineSelectionState = lastLine-> selectionState(); 416 LayoutObject::SelectionState lastLineSelectionState = lastLine-> selectionState();
417 if (lastLineSelectionState != RenderObject::SelectionInside && l astLineSelectionState != RenderObject::SelectionStart) 417 if (lastLineSelectionState != LayoutObject::SelectionInside && l astLineSelectionState != LayoutObject::SelectionStart)
418 return top; 418 return top;
419 419
420 LayoutUnit lastLineSelectionBottom = lastLine->selectionBottom() + offsetToBlockBefore.height(); 420 LayoutUnit lastLineSelectionBottom = lastLine->selectionBottom() + offsetToBlockBefore.height();
421 top = std::max(top, lastLineSelectionBottom); 421 top = std::max(top, lastLineSelectionBottom);
422 } 422 }
423 } 423 }
424 } 424 }
425 425
426 return top; 426 return top;
427 } 427 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 } 513 }
514 514
515 return closestLeaf ? closestLeaf : lastLeaf; 515 return closestLeaf ? closestLeaf : lastLeaf;
516 } 516 }
517 517
518 BidiStatus RootInlineBox::lineBreakBidiStatus() const 518 BidiStatus RootInlineBox::lineBreakBidiStatus() const
519 { 519 {
520 return BidiStatus(static_cast<WTF::Unicode::Direction>(m_lineBreakBidiStatus Eor), static_cast<WTF::Unicode::Direction>(m_lineBreakBidiStatusLastStrong), sta tic_cast<WTF::Unicode::Direction>(m_lineBreakBidiStatusLast), m_lineBreakContext ); 520 return BidiStatus(static_cast<WTF::Unicode::Direction>(m_lineBreakBidiStatus Eor), static_cast<WTF::Unicode::Direction>(m_lineBreakBidiStatusLastStrong), sta tic_cast<WTF::Unicode::Direction>(m_lineBreakBidiStatusLast), m_lineBreakContext );
521 } 521 }
522 522
523 void RootInlineBox::setLineBreakInfo(RenderObject* obj, unsigned breakPos, const BidiStatus& status) 523 void RootInlineBox::setLineBreakInfo(LayoutObject* obj, unsigned breakPos, const BidiStatus& status)
524 { 524 {
525 // When setting lineBreakObj, the RenderObject must not be a RenderInline 525 // When setting lineBreakObj, the LayoutObject must not be a RenderInline
526 // with no line boxes, otherwise all sorts of invariants are broken later. 526 // with no line boxes, otherwise all sorts of invariants are broken later.
527 // This has security implications because if the RenderObject does not 527 // This has security implications because if the LayoutObject does not
528 // point to at least one line box, then that RenderInline can be deleted 528 // point to at least one line box, then that RenderInline can be deleted
529 // later without resetting the lineBreakObj, leading to use-after-free. 529 // later without resetting the lineBreakObj, leading to use-after-free.
530 ASSERT_WITH_SECURITY_IMPLICATION(!obj || obj->isText() || !(obj->isRenderInl ine() && obj->isBox() && !toRenderBox(obj)->inlineBoxWrapper())); 530 ASSERT_WITH_SECURITY_IMPLICATION(!obj || obj->isText() || !(obj->isRenderInl ine() && obj->isBox() && !toRenderBox(obj)->inlineBoxWrapper()));
531 531
532 m_lineBreakObj = obj; 532 m_lineBreakObj = obj;
533 m_lineBreakPos = breakPos; 533 m_lineBreakPos = breakPos;
534 m_lineBreakBidiStatusEor = status.eor; 534 m_lineBreakBidiStatusEor = status.eor;
535 m_lineBreakBidiStatusLastStrong = status.lastStrong; 535 m_lineBreakBidiStatusLastStrong = status.lastStrong;
536 m_lineBreakBidiStatusLast = status.last; 536 m_lineBreakBidiStatusLast = status.last;
537 m_lineBreakContext = status.context; 537 m_lineBreakContext = status.context;
538 } 538 }
539 539
540 EllipsisBox* RootInlineBox::ellipsisBox() const 540 EllipsisBox* RootInlineBox::ellipsisBox() const
541 { 541 {
542 if (!hasEllipsisBox()) 542 if (!hasEllipsisBox())
543 return 0; 543 return 0;
544 return gEllipsisBoxMap->get(this); 544 return gEllipsisBoxMap->get(this);
545 } 545 }
546 546
547 void RootInlineBox::removeLineBoxFromRenderObject() 547 void RootInlineBox::removeLineBoxFromLayoutObject()
548 { 548 {
549 block().lineBoxes()->removeLineBox(this); 549 block().lineBoxes()->removeLineBox(this);
550 } 550 }
551 551
552 void RootInlineBox::extractLineBoxFromRenderObject() 552 void RootInlineBox::extractLineBoxFromLayoutObject()
553 { 553 {
554 block().lineBoxes()->extractLineBox(this); 554 block().lineBoxes()->extractLineBox(this);
555 } 555 }
556 556
557 void RootInlineBox::attachLineBoxToRenderObject() 557 void RootInlineBox::attachLineBoxToLayoutObject()
558 { 558 {
559 block().lineBoxes()->attachLineBox(this); 559 block().lineBoxes()->attachLineBox(this);
560 } 560 }
561 561
562 LayoutRect RootInlineBox::paddedLayoutOverflowRect(LayoutUnit endPadding) const 562 LayoutRect RootInlineBox::paddedLayoutOverflowRect(LayoutUnit endPadding) const
563 { 563 {
564 LayoutRect lineLayoutOverflow = layoutOverflowRect(lineTop(), lineBottom()); 564 LayoutRect lineLayoutOverflow = layoutOverflowRect(lineTop(), lineBottom());
565 if (!endPadding) 565 if (!endPadding)
566 return lineLayoutOverflow; 566 return lineLayoutOverflow;
567 567
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 LayoutUnit verticalPosition = verticalPositionCache.get(renderer, baseli neType()); 712 LayoutUnit verticalPosition = verticalPositionCache.get(renderer, baseli neType());
713 if (verticalPosition != PositionUndefined) 713 if (verticalPosition != PositionUndefined)
714 return verticalPosition; 714 return verticalPosition;
715 } 715 }
716 716
717 LayoutUnit verticalPosition = 0; 717 LayoutUnit verticalPosition = 0;
718 EVerticalAlign verticalAlign = renderer->style()->verticalAlign(); 718 EVerticalAlign verticalAlign = renderer->style()->verticalAlign();
719 if (verticalAlign == TOP || verticalAlign == BOTTOM) 719 if (verticalAlign == TOP || verticalAlign == BOTTOM)
720 return 0; 720 return 0;
721 721
722 RenderObject* parent = renderer->parent(); 722 LayoutObject* parent = renderer->parent();
723 if (parent->isRenderInline() && parent->style()->verticalAlign() != TOP && p arent->style()->verticalAlign() != BOTTOM) 723 if (parent->isRenderInline() && parent->style()->verticalAlign() != TOP && p arent->style()->verticalAlign() != BOTTOM)
724 verticalPosition = box->parent()->logicalTop(); 724 verticalPosition = box->parent()->logicalTop();
725 725
726 if (verticalAlign != BASELINE) { 726 if (verticalAlign != BASELINE) {
727 const Font& font = parent->style(firstLine)->font(); 727 const Font& font = parent->style(firstLine)->font();
728 const FontMetrics& fontMetrics = font.fontMetrics(); 728 const FontMetrics& fontMetrics = font.fontMetrics();
729 int fontSize = font.fontDescription().computedPixelSize(); 729 int fontSize = font.fontDescription().computedPixelSize();
730 730
731 LineDirectionMode lineDirection = parent->isHorizontalWritingMode() ? Ho rizontalLine : VerticalLine; 731 LineDirectionMode lineDirection = parent->isHorizontalWritingMode() ? Ho rizontalLine : VerticalLine;
732 732
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 } 850 }
851 851
852 #ifndef NDEBUG 852 #ifndef NDEBUG
853 const char* RootInlineBox::boxName() const 853 const char* RootInlineBox::boxName() const
854 { 854 {
855 return "RootInlineBox"; 855 return "RootInlineBox";
856 } 856 }
857 #endif 857 #endif
858 858
859 } // namespace blink 859 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/layout/line/RootInlineBox.h ('k') | Source/core/layout/line/TrailingObjects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698