OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. 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 are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 : RenderBlockFlow(element) | 218 : RenderBlockFlow(element) |
219 { | 219 { |
220 } | 220 } |
221 | 221 |
222 RenderRubyAsBlock::~RenderRubyAsBlock() | 222 RenderRubyAsBlock::~RenderRubyAsBlock() |
223 { | 223 { |
224 } | 224 } |
225 | 225 |
226 void RenderRubyAsBlock::styleDidChange(StyleDifference diff, const RenderStyle*
oldStyle) | 226 void RenderRubyAsBlock::styleDidChange(StyleDifference diff, const RenderStyle*
oldStyle) |
227 { | 227 { |
228 RenderBlock::styleDidChange(diff, oldStyle); | 228 RenderBlockFlow::styleDidChange(diff, oldStyle); |
229 propagateStyleToAnonymousChildren(); | 229 propagateStyleToAnonymousChildren(); |
230 } | 230 } |
231 | 231 |
232 void RenderRubyAsBlock::addChild(RenderObject* child, RenderObject* beforeChild) | 232 void RenderRubyAsBlock::addChild(RenderObject* child, RenderObject* beforeChild) |
233 { | 233 { |
234 // Insert :before and :after content before/after the RenderRubyRun(s) | 234 // Insert :before and :after content before/after the RenderRubyRun(s) |
235 if (child->isBeforeContent()) { | 235 if (child->isBeforeContent()) { |
236 if (child->isInline()) { | 236 if (child->isInline()) { |
237 // Add generated inline content normally | 237 // Add generated inline content normally |
238 RenderBlock::addChild(child, firstChild()); | 238 RenderBlockFlow::addChild(child, firstChild()); |
239 } else { | 239 } else { |
240 // Wrap non-inline content with an anonymous inline-block. | 240 // Wrap non-inline content with an anonymous inline-block. |
241 RenderBlock* beforeBlock = rubyBeforeBlock(this); | 241 RenderBlock* beforeBlock = rubyBeforeBlock(this); |
242 if (!beforeBlock) { | 242 if (!beforeBlock) { |
243 beforeBlock = createAnonymousRubyInlineBlock(this); | 243 beforeBlock = createAnonymousRubyInlineBlock(this); |
244 RenderBlock::addChild(beforeBlock, firstChild()); | 244 RenderBlockFlow::addChild(beforeBlock, firstChild()); |
245 } | 245 } |
246 beforeBlock->addChild(child); | 246 beforeBlock->addChild(child); |
247 } | 247 } |
248 return; | 248 return; |
249 } | 249 } |
250 if (child->isAfterContent()) { | 250 if (child->isAfterContent()) { |
251 if (child->isInline()) { | 251 if (child->isInline()) { |
252 // Add generated inline content normally | 252 // Add generated inline content normally |
253 RenderBlock::addChild(child); | 253 RenderBlockFlow::addChild(child); |
254 } else { | 254 } else { |
255 // Wrap non-inline content with an anonymous inline-block. | 255 // Wrap non-inline content with an anonymous inline-block. |
256 RenderBlock* afterBlock = rubyAfterBlock(this); | 256 RenderBlock* afterBlock = rubyAfterBlock(this); |
257 if (!afterBlock) { | 257 if (!afterBlock) { |
258 afterBlock = createAnonymousRubyInlineBlock(this); | 258 afterBlock = createAnonymousRubyInlineBlock(this); |
259 RenderBlock::addChild(afterBlock); | 259 RenderBlockFlow::addChild(afterBlock); |
260 } | 260 } |
261 afterBlock->addChild(child); | 261 afterBlock->addChild(child); |
262 } | 262 } |
263 return; | 263 return; |
264 } | 264 } |
265 | 265 |
266 // If the child is a ruby run, just add it normally. | 266 // If the child is a ruby run, just add it normally. |
267 if (child->isRubyRun()) { | 267 if (child->isRubyRun()) { |
268 RenderBlock::addChild(child, beforeChild); | 268 RenderBlockFlow::addChild(child, beforeChild); |
269 return; | 269 return; |
270 } | 270 } |
271 | 271 |
272 if (beforeChild && !isAfterContent(beforeChild)) { | 272 if (beforeChild && !isAfterContent(beforeChild)) { |
273 // insert child into run | 273 // insert child into run |
274 ASSERT(!beforeChild->isRubyRun()); | 274 ASSERT(!beforeChild->isRubyRun()); |
275 RenderObject* run = beforeChild; | 275 RenderObject* run = beforeChild; |
276 while (run && !run->isRubyRun()) | 276 while (run && !run->isRubyRun()) |
277 run = run->parent(); | 277 run = run->parent(); |
278 if (run) { | 278 if (run) { |
279 run->addChild(child, beforeChild); | 279 run->addChild(child, beforeChild); |
280 return; | 280 return; |
281 } | 281 } |
282 ASSERT_NOT_REACHED(); // beforeChild should always have a run as parent! | 282 ASSERT_NOT_REACHED(); // beforeChild should always have a run as parent! |
283 // Emergency fallback: fall through and just append. | 283 // Emergency fallback: fall through and just append. |
284 } | 284 } |
285 | 285 |
286 // If the new child would be appended, try to add the child to the previous
run | 286 // If the new child would be appended, try to add the child to the previous
run |
287 // if possible, or create a new run otherwise. | 287 // if possible, or create a new run otherwise. |
288 // (The RenderRubyRun object will handle the details) | 288 // (The RenderRubyRun object will handle the details) |
289 RenderRubyRun* lastRun = lastRubyRun(this); | 289 RenderRubyRun* lastRun = lastRubyRun(this); |
290 if (!lastRun || lastRun->hasRubyText()) { | 290 if (!lastRun || lastRun->hasRubyText()) { |
291 lastRun = RenderRubyRun::staticCreateRubyRun(this); | 291 lastRun = RenderRubyRun::staticCreateRubyRun(this); |
292 RenderBlock::addChild(lastRun, beforeChild); | 292 RenderBlockFlow::addChild(lastRun, beforeChild); |
293 } | 293 } |
294 lastRun->addChild(child); | 294 lastRun->addChild(child); |
295 } | 295 } |
296 | 296 |
297 void RenderRubyAsBlock::removeChild(RenderObject* child) | 297 void RenderRubyAsBlock::removeChild(RenderObject* child) |
298 { | 298 { |
299 // If the child's parent is *this (must be a ruby run or generated content o
r anonymous block), | 299 // If the child's parent is *this (must be a ruby run or generated content o
r anonymous block), |
300 // just use the normal remove method. | 300 // just use the normal remove method. |
301 if (child->parent() == this) { | 301 if (child->parent() == this) { |
302 ASSERT(child->isRubyRun() || child->isBeforeContent() || child->isAfterC
ontent() || isAnonymousRubyInlineBlock(child)); | 302 ASSERT(child->isRubyRun() || child->isBeforeContent() || child->isAfterC
ontent() || isAnonymousRubyInlineBlock(child)); |
303 RenderBlock::removeChild(child); | 303 RenderBlockFlow::removeChild(child); |
304 return; | 304 return; |
305 } | 305 } |
306 // If the child's parent is an anoymous block (must be generated :before/:af
ter content) | 306 // If the child's parent is an anoymous block (must be generated :before/:af
ter content) |
307 // just use the block's remove method. | 307 // just use the block's remove method. |
308 if (isAnonymousRubyInlineBlock(child->parent())) { | 308 if (isAnonymousRubyInlineBlock(child->parent())) { |
309 ASSERT(child->isBeforeContent() || child->isAfterContent()); | 309 ASSERT(child->isBeforeContent() || child->isAfterContent()); |
310 child->parent()->removeChild(child); | 310 child->parent()->removeChild(child); |
311 removeChild(child->parent()); | 311 removeChild(child->parent()); |
312 return; | 312 return; |
313 } | 313 } |
314 | 314 |
315 // Otherwise find the containing run and remove it from there. | 315 // Otherwise find the containing run and remove it from there. |
316 RenderRubyRun* run = findRubyRunParent(child); | 316 RenderRubyRun* run = findRubyRunParent(child); |
317 ASSERT(run); | 317 ASSERT(run); |
318 run->removeChild(child); | 318 run->removeChild(child); |
319 } | 319 } |
320 | 320 |
321 } // namespace WebCore | 321 } // namespace WebCore |
OLD | NEW |