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

Side by Side Diff: third_party/WebKit/WebCore/rendering/RenderInline.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 * This file is part of the render object implementation for KHTML. 2 * This file is part of the render object implementation for KHTML.
3 * 3 *
4 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 4 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5 * (C) 1999 Antti Koivisto (koivisto@kde.org) 5 * (C) 1999 Antti Koivisto (koivisto@kde.org)
6 * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc. 6 * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 RenderContainer* nextCont = currCont->continuation(); 111 RenderContainer* nextCont = currCont->continuation();
112 currCont->setContinuation(0); 112 currCont->setContinuation(0);
113 currCont->setStyle(style()); 113 currCont->setStyle(style());
114 currCont->setContinuation(nextCont); 114 currCont->setContinuation(nextCont);
115 } 115 }
116 116
117 m_lineHeight = -1; 117 m_lineHeight = -1;
118 118
119 // Update pseudos for :before and :after now. 119 // Update pseudos for :before and :after now.
120 if (!isAnonymous() && document()->usesBeforeAfterRules()) { 120 if (!isAnonymous() && document()->usesBeforeAfterRules()) {
121 updateBeforeAfterContent(RenderStyle::BEFORE); 121 children()->updateBeforeAfterContent(this, RenderStyle::BEFORE);
122 updateBeforeAfterContent(RenderStyle::AFTER); 122 children()->updateBeforeAfterContent(this, RenderStyle::AFTER);
123 } 123 }
124 } 124 }
125 125
126 static inline bool isAfterContent(RenderObject* child) 126 static inline bool isAfterContent(RenderObject* child)
127 { 127 {
128 if (!child) 128 if (!child)
129 return false; 129 return false;
130 if (child->style()->styleType() != RenderStyle::AFTER) 130 if (child->style()->styleType() != RenderStyle::AFTER)
131 return false; 131 return false;
132 // Text nodes don't have their own styles, so ignore the style on a text nod e. 132 // Text nodes don't have their own styles, so ignore the style on a text nod e.
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 RenderBlock* newBox = new (renderArena()) RenderBlock(document() /* anon ymous box */); 192 RenderBlock* newBox = new (renderArena()) RenderBlock(document() /* anon ymous box */);
193 newBox->setStyle(newStyle.release()); 193 newBox->setStyle(newStyle.release());
194 RenderContainer* oldContinuation = continuation(); 194 RenderContainer* oldContinuation = continuation();
195 setContinuation(newBox); 195 setContinuation(newBox);
196 196
197 // Someone may have put a <p> inside a <q>, causing a split. When this happens, the :after content 197 // Someone may have put a <p> inside a <q>, causing a split. When this happens, the :after content
198 // has to move into the inline continuation. Call updateBeforeAfterCont ent to ensure that our :after 198 // has to move into the inline continuation. Call updateBeforeAfterCont ent to ensure that our :after
199 // content gets properly destroyed. 199 // content gets properly destroyed.
200 bool isLastChild = (beforeChild == lastChild()); 200 bool isLastChild = (beforeChild == lastChild());
201 if (document()->usesBeforeAfterRules()) 201 if (document()->usesBeforeAfterRules())
202 updateBeforeAfterContent(RenderStyle::AFTER); 202 children()->updateBeforeAfterContent(this, RenderStyle::AFTER);
203 if (isLastChild && beforeChild != lastChild()) 203 if (isLastChild && beforeChild != lastChild())
204 beforeChild = 0; // We destroyed the last child, so now we need to u pdate our insertion 204 beforeChild = 0; // We destroyed the last child, so now we need to u pdate our insertion
205 // point to be 0. It's just a straight append now. 205 // point to be 0. It's just a straight append now.
206 206
207 splitFlow(beforeChild, newBox, newChild, oldContinuation); 207 splitFlow(beforeChild, newBox, newChild, oldContinuation);
208 return; 208 return;
209 } 209 }
210 210
211 RenderContainer::addChild(newChild, beforeChild); 211 RenderContainer::addChild(newChild, beforeChild);
212 212
(...skipping 14 matching lines...) Expand all
227 // Create a clone of this inline. 227 // Create a clone of this inline.
228 RenderInline* clone = cloneInline(this); 228 RenderInline* clone = cloneInline(this);
229 clone->setContinuation(oldCont); 229 clone->setContinuation(oldCont);
230 230
231 // Now take all of the children from beforeChild to the end and remove 231 // Now take all of the children from beforeChild to the end and remove
232 // them from |this| and place them in the clone. 232 // them from |this| and place them in the clone.
233 RenderObject* o = beforeChild; 233 RenderObject* o = beforeChild;
234 while (o) { 234 while (o) {
235 RenderObject* tmp = o; 235 RenderObject* tmp = o;
236 o = tmp->nextSibling(); 236 o = tmp->nextSibling();
237 clone->addChildIgnoringContinuation(removeChildNode(tmp), 0); 237 clone->addChildIgnoringContinuation(children()->removeChildNode(this, tm p), 0);
238 tmp->setNeedsLayoutAndPrefWidthsRecalc(); 238 tmp->setNeedsLayoutAndPrefWidthsRecalc();
239 } 239 }
240 240
241 // Hook |clone| up as the continuation of the middle block. 241 // Hook |clone| up as the continuation of the middle block.
242 middleBlock->setInlineContinuation(clone); 242 middleBlock->setInlineContinuation(clone);
243 243
244 // We have been reparented and are now under the fromBlock. We need 244 // We have been reparented and are now under the fromBlock. We need
245 // to walk up our inline parent chain until we hit the containing block. 245 // to walk up our inline parent chain until we hit the containing block.
246 // Once we hit the containing block we're done. 246 // Once we hit the containing block we're done.
247 RenderContainer* curr = static_cast<RenderContainer*>(parent()); 247 RenderContainer* curr = static_cast<RenderContainer*>(parent());
(...skipping 18 matching lines...) Expand all
266 // Hook the clone up as a continuation of |curr|. 266 // Hook the clone up as a continuation of |curr|.
267 RenderInline* inlineCurr = toRenderInline(curr); 267 RenderInline* inlineCurr = toRenderInline(curr);
268 oldCont = inlineCurr->continuation(); 268 oldCont = inlineCurr->continuation();
269 inlineCurr->setContinuation(clone); 269 inlineCurr->setContinuation(clone);
270 clone->setContinuation(oldCont); 270 clone->setContinuation(oldCont);
271 271
272 // Someone may have indirectly caused a <q> to split. When this hap pens, the :after content 272 // Someone may have indirectly caused a <q> to split. When this hap pens, the :after content
273 // has to move into the inline continuation. Call updateBeforeAfter Content to ensure that the inline's :after 273 // has to move into the inline continuation. Call updateBeforeAfter Content to ensure that the inline's :after
274 // content gets properly destroyed. 274 // content gets properly destroyed.
275 if (document()->usesBeforeAfterRules()) 275 if (document()->usesBeforeAfterRules())
276 curr->updateBeforeAfterContent(RenderStyle::AFTER); 276 inlineCurr->children()->updateBeforeAfterContent(this, RenderSty le::AFTER);
277 277
278 // Now we need to take all of the children starting from the first c hild 278 // Now we need to take all of the children starting from the first c hild
279 // *after* currChild and append them all to the clone. 279 // *after* currChild and append them all to the clone.
280 o = currChild->nextSibling(); 280 o = currChild->nextSibling();
281 while (o) { 281 while (o) {
282 RenderObject* tmp = o; 282 RenderObject* tmp = o;
283 o = tmp->nextSibling(); 283 o = tmp->nextSibling();
284 clone->addChildIgnoringContinuation(curr->removeChildNode(tmp), 0); 284 clone->addChildIgnoringContinuation(curr->children()->removeChil dNode(curr, tmp), 0);
285 tmp->setNeedsLayoutAndPrefWidthsRecalc(); 285 tmp->setNeedsLayoutAndPrefWidthsRecalc();
286 } 286 }
287 } 287 }
288 288
289 // Keep walking up the chain. 289 // Keep walking up the chain.
290 currChild = curr; 290 currChild = curr;
291 curr = static_cast<RenderContainer*>(curr->parent()); 291 curr = static_cast<RenderContainer*>(curr->parent());
292 splitDepth++; 292 splitDepth++;
293 } 293 }
294 294
295 // Now we are at the block level. We need to put the clone into the toBlock. 295 // Now we are at the block level. We need to put the clone into the toBlock.
296 toBlock->appendChildNode(clone); 296 toBlock->children()->appendChildNode(toBlock, clone);
297 297
298 // Now take all the children after currChild and remove them from the fromBl ock 298 // Now take all the children after currChild and remove them from the fromBl ock
299 // and put them in the toBlock. 299 // and put them in the toBlock.
300 o = currChild->nextSibling(); 300 o = currChild->nextSibling();
301 while (o) { 301 while (o) {
302 RenderObject* tmp = o; 302 RenderObject* tmp = o;
303 o = tmp->nextSibling(); 303 o = tmp->nextSibling();
304 toBlock->appendChildNode(fromBlock->removeChildNode(tmp)); 304 toBlock->children()->appendChildNode(toBlock, fromBlock->children()->rem oveChildNode(fromBlock, tmp));
305 } 305 }
306 } 306 }
307 307
308 void RenderInline::splitFlow(RenderObject* beforeChild, RenderBlock* newBlockBox , 308 void RenderInline::splitFlow(RenderObject* beforeChild, RenderBlock* newBlockBox ,
309 RenderObject* newChild, RenderContainer* oldCont) 309 RenderObject* newChild, RenderContainer* oldCont)
310 { 310 {
311 RenderBlock* pre = 0; 311 RenderBlock* pre = 0;
312 RenderBlock* block = containingBlock(); 312 RenderBlock* block = containingBlock();
313 313
314 // Delete our line boxes before we do the inline split into continuations. 314 // Delete our line boxes before we do the inline split into continuations.
315 block->deleteLineBoxTree(); 315 block->deleteLineBoxTree();
316 316
317 bool madeNewBeforeBlock = false; 317 bool madeNewBeforeBlock = false;
318 if (block->isAnonymousBlock() && (!block->parent() || !block->parent()->crea tesAnonymousWrapper())) { 318 if (block->isAnonymousBlock() && (!block->parent() || !block->parent()->crea tesAnonymousWrapper())) {
319 // We can reuse this block and make it the preBlock of the next continua tion. 319 // We can reuse this block and make it the preBlock of the next continua tion.
320 pre = block; 320 pre = block;
321 block = block->containingBlock(); 321 block = block->containingBlock();
322 } else { 322 } else {
323 // No anonymous block available for use. Make one. 323 // No anonymous block available for use. Make one.
324 pre = block->createAnonymousBlock(); 324 pre = block->createAnonymousBlock();
325 madeNewBeforeBlock = true; 325 madeNewBeforeBlock = true;
326 } 326 }
327 327
328 RenderBlock* post = block->createAnonymousBlock(); 328 RenderBlock* post = block->createAnonymousBlock();
329 329
330 RenderObject* boxFirst = madeNewBeforeBlock ? block->firstChild() : pre->nex tSibling(); 330 RenderObject* boxFirst = madeNewBeforeBlock ? block->firstChild() : pre->nex tSibling();
331 if (madeNewBeforeBlock) 331 if (madeNewBeforeBlock)
332 block->insertChildNode(pre, boxFirst); 332 block->children()->insertChildNode(block, pre, boxFirst);
333 block->insertChildNode(newBlockBox, boxFirst); 333 block->children()->insertChildNode(block, newBlockBox, boxFirst);
334 block->insertChildNode(post, boxFirst); 334 block->children()->insertChildNode(block, post, boxFirst);
335 block->setChildrenInline(false); 335 block->setChildrenInline(false);
336 336
337 if (madeNewBeforeBlock) { 337 if (madeNewBeforeBlock) {
338 RenderObject* o = boxFirst; 338 RenderObject* o = boxFirst;
339 while (o) { 339 while (o) {
340 RenderObject* no = o; 340 RenderObject* no = o;
341 o = no->nextSibling(); 341 o = no->nextSibling();
342 pre->appendChildNode(block->removeChildNode(no)); 342 pre->children()->appendChildNode(pre, block->children()->removeChild Node(block, no));
343 no->setNeedsLayoutAndPrefWidthsRecalc(); 343 no->setNeedsLayoutAndPrefWidthsRecalc();
344 } 344 }
345 } 345 }
346 346
347 splitInlines(pre, post, newBlockBox, beforeChild, oldCont); 347 splitInlines(pre, post, newBlockBox, beforeChild, oldCont);
348 348
349 // We already know the newBlockBox isn't going to contain inline kids, so av oid wasting 349 // We already know the newBlockBox isn't going to contain inline kids, so av oid wasting
350 // time in makeChildrenNonInline by just setting this explicitly up front. 350 // time in makeChildrenNonInline by just setting this explicitly up front.
351 newBlockBox->setChildrenInline(false); 351 newBlockBox->setChildrenInline(false);
352 352
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 continuation()->updateDragState(dragOn); 595 continuation()->updateDragState(dragOn);
596 } 596 }
597 597
598 void RenderInline::childBecameNonInline(RenderObject* child) 598 void RenderInline::childBecameNonInline(RenderObject* child)
599 { 599 {
600 // We have to split the parent flow. 600 // We have to split the parent flow.
601 RenderBlock* newBox = createAnonymousBlock(); 601 RenderBlock* newBox = createAnonymousBlock();
602 RenderContainer* oldContinuation = continuation(); 602 RenderContainer* oldContinuation = continuation();
603 setContinuation(newBox); 603 setContinuation(newBox);
604 RenderObject* beforeChild = child->nextSibling(); 604 RenderObject* beforeChild = child->nextSibling();
605 removeChildNode(child); 605 children()->removeChildNode(this, child);
606 splitFlow(beforeChild, newBox, child, oldContinuation); 606 splitFlow(beforeChild, newBox, child, oldContinuation);
607 } 607 }
608 608
609 void RenderInline::updateHitTestResult(HitTestResult& result, const IntPoint& po int) 609 void RenderInline::updateHitTestResult(HitTestResult& result, const IntPoint& po int)
610 { 610 {
611 if (result.innerNode()) 611 if (result.innerNode())
612 return; 612 return;
613 613
614 Node* node = element(); 614 Node* node = element();
615 IntPoint localPoint(point); 615 IntPoint localPoint(point);
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 max(!nextline.isEmpty() ? tx + nextline.right() : -1000000, l - ow), 833 max(!nextline.isEmpty() ? tx + nextline.right() : -1000000, l - ow),
834 b, 834 b,
835 r + ow, 835 r + ow,
836 b + ow, 836 b + ow,
837 BSBottom, oc, style()->color(), os, 837 BSBottom, oc, style()->color(), os,
838 (!nextline.isEmpty() && l - ow < tx + nextline.right()) ? -ow : ow, 838 (!nextline.isEmpty() && l - ow < tx + nextline.right()) ? -ow : ow,
839 ow); 839 ow);
840 } 840 }
841 841
842 } // namespace WebCore 842 } // namespace WebCore
OLDNEW
« no previous file with comments | « third_party/WebKit/WebCore/rendering/RenderCounter.cpp ('k') | third_party/WebKit/WebCore/rendering/RenderObject.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698