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

Side by Side Diff: third_party/WebKit/WebCore/rendering/RenderBlock.cpp

Issue 20076: WebKit merge 40500:40539 [WebKit side] (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 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
OLDNEW
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) 2007 David Smith (catfish.man@gmail.com) 4 * (C) 2007 David Smith (catfish.man@gmail.com)
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserv ed. 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserv ed.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 using namespace Unicode; 48 using namespace Unicode;
49 49
50 namespace WebCore { 50 namespace WebCore {
51 51
52 // Number of pixels to allow as a fudge factor when clicking above or below a li ne. 52 // Number of pixels to allow as a fudge factor when clicking above or below a li ne.
53 // clicking up to verticalLineClickFudgeFactor pixels above a line will correspo nd to the closest point on the line. 53 // clicking up to verticalLineClickFudgeFactor pixels above a line will correspo nd to the closest point on the line.
54 const int verticalLineClickFudgeFactor= 3; 54 const int verticalLineClickFudgeFactor= 3;
55 55
56 using namespace HTMLNames; 56 using namespace HTMLNames;
57 57
58 static void moveChild(RenderObject* to, RenderObjectChildList* toChildList, Rend erObject* from, RenderObjectChildList* fromChildList, RenderObject* child)
59 {
60 ASSERT(from == child->parent());
61 toChildList->appendChildNode(to, fromChildList->removeChildNode(from, child, false), false);
62 }
63
58 struct ColumnInfo { 64 struct ColumnInfo {
59 ColumnInfo() 65 ColumnInfo()
60 : m_desiredColumnWidth(0) 66 : m_desiredColumnWidth(0)
61 , m_desiredColumnCount(1) 67 , m_desiredColumnCount(1)
62 { } 68 { }
63 int m_desiredColumnWidth; 69 int m_desiredColumnWidth;
64 unsigned m_desiredColumnCount; 70 unsigned m_desiredColumnCount;
65 Vector<IntRect> m_columnRects; 71 Vector<IntRect> m_columnRects;
66 }; 72 };
67 73
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 m_lineHeight = -1; 244 m_lineHeight = -1;
239 245
240 // Update pseudos for :before and :after now. 246 // Update pseudos for :before and :after now.
241 if (!isAnonymous() && document()->usesBeforeAfterRules() && canHaveChildren( )) { 247 if (!isAnonymous() && document()->usesBeforeAfterRules() && canHaveChildren( )) {
242 updateBeforeAfterContent(RenderStyle::BEFORE); 248 updateBeforeAfterContent(RenderStyle::BEFORE);
243 updateBeforeAfterContent(RenderStyle::AFTER); 249 updateBeforeAfterContent(RenderStyle::AFTER);
244 } 250 }
245 updateFirstLetter(); 251 updateFirstLetter();
246 } 252 }
247 253
254 void RenderBlock::updateBeforeAfterContent(RenderStyle::PseudoId pseudoId)
255 {
256 // If this is an anonymous wrapper, then the parent applies its own pseudo-e lement style to it.
257 if (parent() && parent()->createsAnonymousWrapper())
258 return;
259 return children()->updateBeforeAfterContent(this, pseudoId);
260 }
261
248 void RenderBlock::addChild(RenderObject* newChild, RenderObject* beforeChild) 262 void RenderBlock::addChild(RenderObject* newChild, RenderObject* beforeChild)
249 { 263 {
250 // Make sure we don't append things after :after-generated content if we hav e it. 264 // Make sure we don't append things after :after-generated content if we hav e it.
251 if (!beforeChild && isAfterContent(lastChild())) 265 if (!beforeChild && isAfterContent(lastChild()))
252 beforeChild = lastChild(); 266 beforeChild = lastChild();
253 267
254 bool madeBoxesNonInline = false; 268 bool madeBoxesNonInline = false;
255 269
256 // If the requested beforeChild is not one of our children, then this is bec ause 270 // If the requested beforeChild is not one of our children, then this is bec ause
257 // there is an anonymous container within this object that contains the befo reChild. 271 // there is an anonymous container within this object that contains the befo reChild.
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 429
416 while (child) { 430 while (child) {
417 RenderObject *inlineRunStart, *inlineRunEnd; 431 RenderObject *inlineRunStart, *inlineRunEnd;
418 getInlineRun(child, insertionPoint, inlineRunStart, inlineRunEnd); 432 getInlineRun(child, insertionPoint, inlineRunStart, inlineRunEnd);
419 433
420 if (!inlineRunStart) 434 if (!inlineRunStart)
421 break; 435 break;
422 436
423 child = inlineRunEnd->nextSibling(); 437 child = inlineRunEnd->nextSibling();
424 438
425 RenderBlock* box = createAnonymousBlock(); 439 RenderBlock* block = createAnonymousBlock();
426 insertChildNode(box, inlineRunStart); 440 children()->insertChildNode(this, block, inlineRunStart);
427 RenderObject* o = inlineRunStart; 441 RenderObject* o = inlineRunStart;
428 while(o != inlineRunEnd) 442 while (o != inlineRunEnd) {
429 {
430 RenderObject* no = o; 443 RenderObject* no = o;
431 o = no->nextSibling(); 444 o = no->nextSibling();
432 box->moveChildNode(no); 445
446 moveChild(block, block->children(), this, children(), no);
433 } 447 }
434 box->moveChildNode(inlineRunEnd); 448 moveChild(block, block->children(), this, children(), inlineRunEnd);
435 } 449 }
436 450
437 #ifndef NDEBUG 451 #ifndef NDEBUG
438 for (RenderObject *c = firstChild(); c; c = c->nextSibling()) 452 for (RenderObject *c = firstChild(); c; c = c->nextSibling())
439 ASSERT(!c->isInline()); 453 ASSERT(!c->isInline());
440 #endif 454 #endif
441 455
442 repaint(); 456 repaint();
443 } 457 }
444 458
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 RenderObject* next = oldChild->nextSibling(); 507 RenderObject* next = oldChild->nextSibling();
494 bool canDeleteAnonymousBlocks = !documentBeingDestroyed() && !isInline() && !oldChild->isInline() && 508 bool canDeleteAnonymousBlocks = !documentBeingDestroyed() && !isInline() && !oldChild->isInline() &&
495 (!oldChild->isRenderBlock() || !toRenderBloc k(oldChild)->inlineContinuation()) && 509 (!oldChild->isRenderBlock() || !toRenderBloc k(oldChild)->inlineContinuation()) &&
496 (!prev || (prev->isAnonymousBlock() && prev- >childrenInline())) && 510 (!prev || (prev->isAnonymousBlock() && prev- >childrenInline())) &&
497 (!next || (next->isAnonymousBlock() && next- >childrenInline())); 511 (!next || (next->isAnonymousBlock() && next- >childrenInline()));
498 if (canDeleteAnonymousBlocks && prev && next) { 512 if (canDeleteAnonymousBlocks && prev && next) {
499 // Take all the children out of the |next| block and put them in 513 // Take all the children out of the |next| block and put them in
500 // the |prev| block. 514 // the |prev| block.
501 prev->setNeedsLayoutAndPrefWidthsRecalc(); 515 prev->setNeedsLayoutAndPrefWidthsRecalc();
502 RenderObject* o = next->firstChild(); 516 RenderObject* o = next->firstChild();
517
518 RenderBlock* nextBlock = toRenderBlock(next);
519 RenderBlock* prevBlock = toRenderBlock(prev);
503 while (o) { 520 while (o) {
504 RenderObject* no = o; 521 RenderObject* no = o;
505 o = no->nextSibling(); 522 o = no->nextSibling();
506 prev->moveChildNode(no); 523 moveChild(prevBlock, prevBlock->children(), nextBlock, nextBlock->ch ildren(), no);
507 } 524 }
508 525
509 RenderBlock* nextBlock = toRenderBlock(next);
510 nextBlock->deleteLineBoxTree(); 526 nextBlock->deleteLineBoxTree();
511 527
512 // Nuke the now-empty block. 528 // Nuke the now-empty block.
513 next->destroy(); 529 next->destroy();
514 } 530 }
515 531
516 RenderContainer::removeChild(oldChild); 532 RenderContainer::removeChild(oldChild);
517 533
518 RenderObject* child = prev ? prev : next; 534 RenderObject* child = prev ? prev : next;
519 if (canDeleteAnonymousBlocks && child && !child->previousSibling() && !child ->nextSibling() && !isFlexibleBox()) { 535 if (canDeleteAnonymousBlocks && child && !child->previousSibling() && !child ->nextSibling() && !isFlexibleBox()) {
520 // The removal has knocked us down to containing only a single anonymous 536 // The removal has knocked us down to containing only a single anonymous
521 // box. We can go ahead and pull the content right back up into our 537 // box. We can go ahead and pull the content right back up into our
522 // box. 538 // box.
523 setNeedsLayoutAndPrefWidthsRecalc(); 539 setNeedsLayoutAndPrefWidthsRecalc();
524 RenderBlock* anonBlock = toRenderBlock(removeChildNode(child, false)); 540 RenderBlock* anonBlock = toRenderBlock(children()->removeChildNode(this, child, false));
525 setChildrenInline(true); 541 setChildrenInline(true);
526 RenderObject* o = anonBlock->firstChild(); 542 RenderObject* o = anonBlock->firstChild();
527 while (o) { 543 while (o) {
528 RenderObject* no = o; 544 RenderObject* no = o;
529 o = no->nextSibling(); 545 o = no->nextSibling();
530 moveChildNode(no); 546 moveChild(this, children(), anonBlock, anonBlock->children(), no);
531 } 547 }
532 548
533 // Delete the now-empty block's lines and nuke it. 549 // Delete the now-empty block's lines and nuke it.
534 anonBlock->deleteLineBoxTree(); 550 anonBlock->deleteLineBoxTree();
535 anonBlock->destroy(); 551 anonBlock->destroy();
536 } 552 }
537 } 553 }
538 554
539 int RenderBlock::overflowHeight(bool includeInterior) const 555 int RenderBlock::overflowHeight(bool includeInterior) const
540 { 556 {
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 if (child->isFloating()) { 972 if (child->isFloating()) {
957 handled = true; 973 handled = true;
958 insertFloatingObject(child); 974 insertFloatingObject(child);
959 adjustFloatingBlock(marginInfo); 975 adjustFloatingBlock(marginInfo);
960 return child->nextSiblingBox(); 976 return child->nextSiblingBox();
961 } 977 }
962 978
963 return 0; 979 return 0;
964 } 980 }
965 981
966 RenderBox* RenderBlock::handleRunInChild(RenderBox* blockRunIn, bool& handled) 982 RenderBox* RenderBlock::handleRunInChild(RenderBox* child, bool& handled)
967 { 983 {
968 // See if we have a run-in element with inline children. If the 984 // See if we have a run-in element with inline children. If the
969 // children aren't inline, then just treat the run-in as a normal 985 // children aren't inline, then just treat the run-in as a normal
970 // block. 986 // block.
971 if (blockRunIn->isRunIn() && (blockRunIn->childrenInline() || blockRunIn->is Replaced())) { 987 if (child->isRunIn() && (child->childrenInline() || child->isReplaced())) {
988 RenderBlock* blockRunIn = toRenderBlock(child);
972 // Get the next non-positioned/non-floating RenderBlock. 989 // Get the next non-positioned/non-floating RenderBlock.
973 RenderObject* curr = blockRunIn->nextSibling(); 990 RenderObject* curr = blockRunIn->nextSibling();
974 while (curr && curr->isFloatingOrPositioned()) 991 while (curr && curr->isFloatingOrPositioned())
975 curr = curr->nextSibling(); 992 curr = curr->nextSibling();
976 if (curr && (curr->isRenderBlock() && curr->childrenInline() && !curr->i sRunIn())) { 993 if (curr && (curr->isRenderBlock() && curr->childrenInline() && !curr->i sRunIn())) {
994 RenderBlock* currBlock = toRenderBlock(curr);
995
977 // The block acts like an inline, so just null out its 996 // The block acts like an inline, so just null out its
978 // position. 997 // position.
979 handled = true; 998 handled = true;
980 999
981 // Remove the old child. 1000 // Remove the old child.
982 RenderBox* next = blockRunIn->nextSiblingBox(); 1001 RenderBox* next = blockRunIn->nextSiblingBox();
983 removeChildNode(blockRunIn); 1002 children()->removeChildNode(this, blockRunIn);
984 1003
985 // Create an inline. 1004 // Create an inline.
986 RenderInline* inlineRunIn = new (renderArena()) RenderInline(blockRu nIn->node()); 1005 RenderInline* inlineRunIn = new (renderArena()) RenderInline(blockRu nIn->node());
987 inlineRunIn->setStyle(blockRunIn->style()); 1006 inlineRunIn->setStyle(blockRunIn->style());
988 1007
989 // Move the nodes from the old child to the new child. 1008 // Move the nodes from the old child to the new child.
990 for (RenderObject* runInChild = blockRunIn->firstChild(); runInChild ; runInChild = runInChild->nextSibling()) 1009 for (RenderObject* runInChild = blockRunIn->firstChild(); runInChild ; runInChild = runInChild->nextSibling())
991 inlineRunIn->moveChildNode(runInChild); 1010 moveChild(inlineRunIn, inlineRunIn->children(), blockRunIn, bloc kRunIn->children(), runInChild);
992 1011
993 // Now insert the new child under |curr|. 1012 // Now insert the new child under |currBlock|.
994 curr->insertChildNode(inlineRunIn, curr->firstChild()); 1013 currBlock->children()->insertChildNode(currBlock, inlineRunIn, currB lock->firstChild());
995 1014
996 // If the run-in had an element, we need to set the new renderer. 1015 // If the run-in had an element, we need to set the new renderer.
997 if (blockRunIn->element()) 1016 if (blockRunIn->element())
998 blockRunIn->element()->setRenderer(inlineRunIn); 1017 blockRunIn->element()->setRenderer(inlineRunIn);
999 1018
1000 // Destroy the block run-in. 1019 // Destroy the block run-in.
1001 blockRunIn->destroy(); 1020 blockRunIn->destroy();
1002 1021
1003 return next; 1022 return next;
1004 } 1023 }
(...skipping 3985 matching lines...) Expand 10 before | Expand all | Expand 10 after
4990 return "RenderBlock (generated)"; 5009 return "RenderBlock (generated)";
4991 if (isRelPositioned()) 5010 if (isRelPositioned())
4992 return "RenderBlock (relative positioned)"; 5011 return "RenderBlock (relative positioned)";
4993 if (isRunIn()) 5012 if (isRunIn())
4994 return "RenderBlock (run-in)"; 5013 return "RenderBlock (run-in)";
4995 return "RenderBlock"; 5014 return "RenderBlock";
4996 } 5015 }
4997 5016
4998 } // namespace WebCore 5017 } // namespace WebCore
4999 5018
OLDNEW
« no previous file with comments | « third_party/WebKit/WebCore/rendering/RenderBlock.h ('k') | third_party/WebKit/WebCore/rendering/RenderBox.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698