OLD | NEW |
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 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
reserved. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
reserved. |
5 * | 5 * |
6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
10 * | 10 * |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 Node::NodeType Text::nodeType() const | 230 Node::NodeType Text::nodeType() const |
231 { | 231 { |
232 return TEXT_NODE; | 232 return TEXT_NODE; |
233 } | 233 } |
234 | 234 |
235 PassRefPtrWillBeRawPtr<Node> Text::cloneNode(bool /*deep*/) | 235 PassRefPtrWillBeRawPtr<Node> Text::cloneNode(bool /*deep*/) |
236 { | 236 { |
237 return cloneWithData(data()); | 237 return cloneWithData(data()); |
238 } | 238 } |
239 | 239 |
240 static inline bool canHaveWhitespaceChildren(const RenderObject& parent) | 240 static inline bool canHaveWhitespaceChildren(const LayoutObject& parent) |
241 { | 241 { |
242 // <button> should allow whitespace even though RenderFlexibleBox doesn't. | 242 // <button> should allow whitespace even though RenderFlexibleBox doesn't. |
243 if (parent.isRenderButton()) | 243 if (parent.isRenderButton()) |
244 return true; | 244 return true; |
245 | 245 |
246 if (parent.isTable() || parent.isTableRow() || parent.isTableSection() | 246 if (parent.isTable() || parent.isTableRow() || parent.isTableSection() |
247 || parent.isLayoutTableCol() || parent.isFrameSet() | 247 || parent.isLayoutTableCol() || parent.isFrameSet() |
248 || parent.isFlexibleBox() || parent.isRenderGrid() | 248 || parent.isFlexibleBox() || parent.isRenderGrid() |
249 || parent.isSVGRoot() | 249 || parent.isSVGRoot() |
250 || parent.isSVGContainer() | 250 || parent.isSVGContainer() |
251 || parent.isSVGImage() | 251 || parent.isSVGImage() |
252 || parent.isSVGShape()) | 252 || parent.isSVGShape()) |
253 return false; | 253 return false; |
254 return true; | 254 return true; |
255 } | 255 } |
256 | 256 |
257 bool Text::textRendererIsNeeded(const RenderStyle& style, const RenderObject& pa
rent) | 257 bool Text::textRendererIsNeeded(const RenderStyle& style, const LayoutObject& pa
rent) |
258 { | 258 { |
259 if (!parent.canHaveChildren()) | 259 if (!parent.canHaveChildren()) |
260 return false; | 260 return false; |
261 | 261 |
262 if (isEditingText()) | 262 if (isEditingText()) |
263 return true; | 263 return true; |
264 | 264 |
265 if (!length()) | 265 if (!length()) |
266 return false; | 266 return false; |
267 | 267 |
268 if (style.display() == NONE) | 268 if (style.display() == NONE) |
269 return false; | 269 return false; |
270 | 270 |
271 if (!containsOnlyWhitespace()) | 271 if (!containsOnlyWhitespace()) |
272 return true; | 272 return true; |
273 | 273 |
274 if (!canHaveWhitespaceChildren(parent)) | 274 if (!canHaveWhitespaceChildren(parent)) |
275 return false; | 275 return false; |
276 | 276 |
277 if (style.preserveNewline()) // pre/pre-wrap/pre-line always make renderers. | 277 if (style.preserveNewline()) // pre/pre-wrap/pre-line always make renderers. |
278 return true; | 278 return true; |
279 | 279 |
280 // childNeedsDistributionRecalc() here is rare, only happens JS calling surr
oundContents() etc. from DOMNodeInsertedIntoDocument etc. | 280 // childNeedsDistributionRecalc() here is rare, only happens JS calling surr
oundContents() etc. from DOMNodeInsertedIntoDocument etc. |
281 if (document().childNeedsDistributionRecalc()) | 281 if (document().childNeedsDistributionRecalc()) |
282 return true; | 282 return true; |
283 | 283 |
284 const RenderObject* prev = NodeRenderingTraversal::previousSiblingRenderer(*
this); | 284 const LayoutObject* prev = NodeRenderingTraversal::previousSiblingRenderer(*
this); |
285 if (prev && prev->isBR()) // <span><br/> <br/></span> | 285 if (prev && prev->isBR()) // <span><br/> <br/></span> |
286 return false; | 286 return false; |
287 | 287 |
288 if (parent.isRenderInline()) { | 288 if (parent.isRenderInline()) { |
289 // <span><div/> <div/></span> | 289 // <span><div/> <div/></span> |
290 if (prev && !prev->isInline()) | 290 if (prev && !prev->isInline()) |
291 return false; | 291 return false; |
292 } else { | 292 } else { |
293 if (parent.isRenderBlock() && !parent.childrenInline() && (!prev || !pre
v->isInline())) | 293 if (parent.isRenderBlock() && !parent.childrenInline() && (!prev || !pre
v->isInline())) |
294 return false; | 294 return false; |
295 | 295 |
296 // Avoiding creation of a Renderer for the text node is a non-essential
memory optimization. | 296 // Avoiding creation of a Renderer for the text node is a non-essential
memory optimization. |
297 // So to avoid blowing up on very wide DOMs, we limit the number of sibl
ings to visit. | 297 // So to avoid blowing up on very wide DOMs, we limit the number of sibl
ings to visit. |
298 unsigned maxSiblingsToVisit = 50; | 298 unsigned maxSiblingsToVisit = 50; |
299 | 299 |
300 RenderObject* first = parent.slowFirstChild(); | 300 LayoutObject* first = parent.slowFirstChild(); |
301 while (first && first->isFloatingOrOutOfFlowPositioned() && maxSiblingsT
oVisit--) | 301 while (first && first->isFloatingOrOutOfFlowPositioned() && maxSiblingsT
oVisit--) |
302 first = first->nextSibling(); | 302 first = first->nextSibling(); |
303 if (!first || first == renderer() || NodeRenderingTraversal::nextSibling
Renderer(*this) == first) | 303 if (!first || first == renderer() || NodeRenderingTraversal::nextSibling
Renderer(*this) == first) |
304 // Whitespace at the start of a block just goes away. Don't even | 304 // Whitespace at the start of a block just goes away. Don't even |
305 // make a render object for this text. | 305 // make a render object for this text. |
306 return false; | 306 return false; |
307 } | 307 } |
308 return true; | 308 return true; |
309 } | 309 } |
310 | 310 |
(...skipping 11 matching lines...) Expand all Loading... |
322 | 322 |
323 if (style->hasTextCombine()) | 323 if (style->hasTextCombine()) |
324 return new RenderCombineText(this, dataImpl()); | 324 return new RenderCombineText(this, dataImpl()); |
325 | 325 |
326 return new RenderText(this, dataImpl()); | 326 return new RenderText(this, dataImpl()); |
327 } | 327 } |
328 | 328 |
329 void Text::attach(const AttachContext& context) | 329 void Text::attach(const AttachContext& context) |
330 { | 330 { |
331 if (ContainerNode* renderingParent = NodeRenderingTraversal::parent(*this))
{ | 331 if (ContainerNode* renderingParent = NodeRenderingTraversal::parent(*this))
{ |
332 if (RenderObject* parentRenderer = renderingParent->renderer()) { | 332 if (LayoutObject* parentRenderer = renderingParent->renderer()) { |
333 if (textRendererIsNeeded(*parentRenderer->style(), *parentRenderer)) | 333 if (textRendererIsNeeded(*parentRenderer->style(), *parentRenderer)) |
334 RenderTreeBuilderForText(*this, parentRenderer).createRenderer()
; | 334 RenderTreeBuilderForText(*this, parentRenderer).createRenderer()
; |
335 } | 335 } |
336 } | 336 } |
337 CharacterData::attach(context); | 337 CharacterData::attach(context); |
338 } | 338 } |
339 | 339 |
340 void Text::reattachIfNeeded(const AttachContext& context) | 340 void Text::reattachIfNeeded(const AttachContext& context) |
341 { | 341 { |
342 bool rendererIsNeeded = false; | 342 bool rendererIsNeeded = false; |
343 ContainerNode* renderingParent = NodeRenderingTraversal::parent(*this); | 343 ContainerNode* renderingParent = NodeRenderingTraversal::parent(*this); |
344 if (renderingParent) { | 344 if (renderingParent) { |
345 if (RenderObject* parentRenderer = renderingParent->renderer()) { | 345 if (LayoutObject* parentRenderer = renderingParent->renderer()) { |
346 if (textRendererIsNeeded(*parentRenderer->style(), *parentRenderer)) | 346 if (textRendererIsNeeded(*parentRenderer->style(), *parentRenderer)) |
347 rendererIsNeeded = true; | 347 rendererIsNeeded = true; |
348 } | 348 } |
349 } | 349 } |
350 | 350 |
351 if (rendererIsNeeded == !!renderer()) | 351 if (rendererIsNeeded == !!renderer()) |
352 return; | 352 return; |
353 | 353 |
354 // The following is almost the same as Node::reattach() except that we creat
e renderer only if needed. | 354 // The following is almost the same as Node::reattach() except that we creat
e renderer only if needed. |
355 // Not calling reattach() to avoid repeated calls to Text::textRendererIsNee
ded(). | 355 // Not calling reattach() to avoid repeated calls to Text::textRendererIsNee
ded(). |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 result.appendLiteral("; "); | 422 result.appendLiteral("; "); |
423 result.appendLiteral("value="); | 423 result.appendLiteral("value="); |
424 result.append(s); | 424 result.append(s); |
425 } | 425 } |
426 | 426 |
427 strncpy(buffer, result.toString().utf8().data(), length - 1); | 427 strncpy(buffer, result.toString().utf8().data(), length - 1); |
428 } | 428 } |
429 #endif | 429 #endif |
430 | 430 |
431 } // namespace blink | 431 } // namespace blink |
OLD | NEW |