| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2006, 2007 Apple 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 | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 } | 155 } |
| 156 result.append('"'); | 156 result.append('"'); |
| 157 return result.toString(); | 157 return result.toString(); |
| 158 } | 158 } |
| 159 | 159 |
| 160 TextStream& operator<<(TextStream& ts, const Color& c) | 160 TextStream& operator<<(TextStream& ts, const Color& c) |
| 161 { | 161 { |
| 162 return ts << c.nameForLayoutTreeAsText(); | 162 return ts << c.nameForLayoutTreeAsText(); |
| 163 } | 163 } |
| 164 | 164 |
| 165 void LayoutTreeAsText::writeRenderObject(TextStream& ts, const RenderObject& o,
LayoutAsTextBehavior behavior) | 165 void LayoutTreeAsText::writeLayoutObject(TextStream& ts, const LayoutObject& o,
LayoutAsTextBehavior behavior) |
| 166 { | 166 { |
| 167 ts << o.renderName(); | 167 ts << o.renderName(); |
| 168 | 168 |
| 169 if (behavior & LayoutAsTextShowAddresses) | 169 if (behavior & LayoutAsTextShowAddresses) |
| 170 ts << " " << static_cast<const void*>(&o); | 170 ts << " " << static_cast<const void*>(&o); |
| 171 | 171 |
| 172 if (o.style() && o.style()->zIndex()) | 172 if (o.style() && o.style()->zIndex()) |
| 173 ts << " zI: " << o.style()->zIndex(); | 173 ts << " zI: " << o.style()->zIndex(); |
| 174 | 174 |
| 175 if (o.node()) { | 175 if (o.node()) { |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 if (run.dirOverride()) | 423 if (run.dirOverride()) |
| 424 ts << " override"; | 424 ts << " override"; |
| 425 } | 425 } |
| 426 ts << ": " | 426 ts << ": " |
| 427 << quoteAndEscapeNonPrintables(String(o.text()).substring(run.start(), r
un.len())); | 427 << quoteAndEscapeNonPrintables(String(o.text()).substring(run.start(), r
un.len())); |
| 428 if (run.hasHyphen()) | 428 if (run.hasHyphen()) |
| 429 ts << " + hyphen string " << quoteAndEscapeNonPrintables(o.style()->hyph
enString()); | 429 ts << " + hyphen string " << quoteAndEscapeNonPrintables(o.style()->hyph
enString()); |
| 430 ts << "\n"; | 430 ts << "\n"; |
| 431 } | 431 } |
| 432 | 432 |
| 433 void write(TextStream& ts, const RenderObject& o, int indent, LayoutAsTextBehavi
or behavior) | 433 void write(TextStream& ts, const LayoutObject& o, int indent, LayoutAsTextBehavi
or behavior) |
| 434 { | 434 { |
| 435 if (o.isSVGShape()) { | 435 if (o.isSVGShape()) { |
| 436 write(ts, toRenderSVGShape(o), indent); | 436 write(ts, toRenderSVGShape(o), indent); |
| 437 return; | 437 return; |
| 438 } | 438 } |
| 439 if (o.isSVGGradientStop()) { | 439 if (o.isSVGGradientStop()) { |
| 440 writeSVGGradientStop(ts, toRenderSVGGradientStop(o), indent); | 440 writeSVGGradientStop(ts, toRenderSVGGradientStop(o), indent); |
| 441 return; | 441 return; |
| 442 } | 442 } |
| 443 if (o.isSVGResourceContainer()) { | 443 if (o.isSVGResourceContainer()) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 460 writeSVGInlineText(ts, toRenderSVGInlineText(o), indent); | 460 writeSVGInlineText(ts, toRenderSVGInlineText(o), indent); |
| 461 return; | 461 return; |
| 462 } | 462 } |
| 463 if (o.isSVGImage()) { | 463 if (o.isSVGImage()) { |
| 464 writeSVGImage(ts, toRenderSVGImage(o), indent); | 464 writeSVGImage(ts, toRenderSVGImage(o), indent); |
| 465 return; | 465 return; |
| 466 } | 466 } |
| 467 | 467 |
| 468 writeIndent(ts, indent); | 468 writeIndent(ts, indent); |
| 469 | 469 |
| 470 LayoutTreeAsText::writeRenderObject(ts, o, behavior); | 470 LayoutTreeAsText::writeLayoutObject(ts, o, behavior); |
| 471 ts << "\n"; | 471 ts << "\n"; |
| 472 | 472 |
| 473 if (o.isText() && !o.isBR()) { | 473 if (o.isText() && !o.isBR()) { |
| 474 const RenderText& text = toRenderText(o); | 474 const RenderText& text = toRenderText(o); |
| 475 for (InlineTextBox* box = text.firstTextBox(); box; box = box->nextTextB
ox()) { | 475 for (InlineTextBox* box = text.firstTextBox(); box; box = box->nextTextB
ox()) { |
| 476 writeIndent(ts, indent + 1); | 476 writeIndent(ts, indent + 1); |
| 477 writeTextRun(ts, text, *box); | 477 writeTextRun(ts, text, *box); |
| 478 } | 478 } |
| 479 } | 479 } |
| 480 | 480 |
| 481 for (RenderObject* child = o.slowFirstChild(); child; child = child->nextSib
ling()) { | 481 for (LayoutObject* child = o.slowFirstChild(); child; child = child->nextSib
ling()) { |
| 482 if (child->hasLayer()) | 482 if (child->hasLayer()) |
| 483 continue; | 483 continue; |
| 484 write(ts, *child, indent + 1, behavior); | 484 write(ts, *child, indent + 1, behavior); |
| 485 } | 485 } |
| 486 | 486 |
| 487 if (o.isRenderPart()) { | 487 if (o.isRenderPart()) { |
| 488 Widget* widget = toRenderPart(o).widget(); | 488 Widget* widget = toRenderPart(o).widget(); |
| 489 if (widget && widget->isFrameView()) { | 489 if (widget && widget->isFrameView()) { |
| 490 FrameView* view = toFrameView(widget); | 490 FrameView* view = toFrameView(widget); |
| 491 RenderView* root = view->renderView(); | 491 RenderView* root = view->renderView(); |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 result.append('}'); | 674 result.append('}'); |
| 675 } | 675 } |
| 676 } else { | 676 } else { |
| 677 result.appendLiteral("document"); | 677 result.appendLiteral("document"); |
| 678 } | 678 } |
| 679 } | 679 } |
| 680 | 680 |
| 681 return result.toString(); | 681 return result.toString(); |
| 682 } | 682 } |
| 683 | 683 |
| 684 static void writeSelection(TextStream& ts, const RenderObject* o) | 684 static void writeSelection(TextStream& ts, const LayoutObject* o) |
| 685 { | 685 { |
| 686 Node* n = o->node(); | 686 Node* n = o->node(); |
| 687 if (!n || !n->isDocumentNode()) | 687 if (!n || !n->isDocumentNode()) |
| 688 return; | 688 return; |
| 689 | 689 |
| 690 Document* doc = toDocument(n); | 690 Document* doc = toDocument(n); |
| 691 LocalFrame* frame = doc->frame(); | 691 LocalFrame* frame = doc->frame(); |
| 692 if (!frame) | 692 if (!frame) |
| 693 return; | 693 return; |
| 694 | 694 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 714 LayoutTreeAsText::writeLayers(ts, layer, layer, layer->rect(), 0, behavior); | 714 LayoutTreeAsText::writeLayers(ts, layer, layer, layer->rect(), 0, behavior); |
| 715 writeSelection(ts, renderer); | 715 writeSelection(ts, renderer); |
| 716 return ts.release(); | 716 return ts.release(); |
| 717 } | 717 } |
| 718 | 718 |
| 719 String externalRepresentation(LocalFrame* frame, LayoutAsTextBehavior behavior) | 719 String externalRepresentation(LocalFrame* frame, LayoutAsTextBehavior behavior) |
| 720 { | 720 { |
| 721 if (!(behavior & LayoutAsTextDontUpdateLayout)) | 721 if (!(behavior & LayoutAsTextDontUpdateLayout)) |
| 722 frame->document()->updateLayout(); | 722 frame->document()->updateLayout(); |
| 723 | 723 |
| 724 RenderObject* renderer = frame->contentRenderer(); | 724 LayoutObject* renderer = frame->contentRenderer(); |
| 725 if (!renderer || !renderer->isBox()) | 725 if (!renderer || !renderer->isBox()) |
| 726 return String(); | 726 return String(); |
| 727 | 727 |
| 728 PrintContext printContext(frame); | 728 PrintContext printContext(frame); |
| 729 if (behavior & LayoutAsTextPrintingMode) | 729 if (behavior & LayoutAsTextPrintingMode) |
| 730 printContext.begin(toRenderBox(renderer)->size().width().toFloat()); | 730 printContext.begin(toRenderBox(renderer)->size().width().toFloat()); |
| 731 | 731 |
| 732 return externalRepresentation(toRenderBox(renderer), behavior); | 732 return externalRepresentation(toRenderBox(renderer), behavior); |
| 733 } | 733 } |
| 734 | 734 |
| 735 String externalRepresentation(Element* element, LayoutAsTextBehavior behavior) | 735 String externalRepresentation(Element* element, LayoutAsTextBehavior behavior) |
| 736 { | 736 { |
| 737 // Doesn't support printing mode. | 737 // Doesn't support printing mode. |
| 738 ASSERT(!(behavior & LayoutAsTextPrintingMode)); | 738 ASSERT(!(behavior & LayoutAsTextPrintingMode)); |
| 739 if (!(behavior & LayoutAsTextDontUpdateLayout)) | 739 if (!(behavior & LayoutAsTextDontUpdateLayout)) |
| 740 element->document().updateLayout(); | 740 element->document().updateLayout(); |
| 741 | 741 |
| 742 RenderObject* renderer = element->renderer(); | 742 LayoutObject* renderer = element->renderer(); |
| 743 if (!renderer || !renderer->isBox()) | 743 if (!renderer || !renderer->isBox()) |
| 744 return String(); | 744 return String(); |
| 745 | 745 |
| 746 return externalRepresentation(toRenderBox(renderer), behavior | LayoutAsText
ShowAllLayers); | 746 return externalRepresentation(toRenderBox(renderer), behavior | LayoutAsText
ShowAllLayers); |
| 747 } | 747 } |
| 748 | 748 |
| 749 static void writeCounterValuesFromChildren(TextStream& stream, RenderObject* par
ent, bool& isFirstCounter) | 749 static void writeCounterValuesFromChildren(TextStream& stream, LayoutObject* par
ent, bool& isFirstCounter) |
| 750 { | 750 { |
| 751 for (RenderObject* child = parent->slowFirstChild(); child; child = child->n
extSibling()) { | 751 for (LayoutObject* child = parent->slowFirstChild(); child; child = child->n
extSibling()) { |
| 752 if (child->isCounter()) { | 752 if (child->isCounter()) { |
| 753 if (!isFirstCounter) | 753 if (!isFirstCounter) |
| 754 stream << " "; | 754 stream << " "; |
| 755 isFirstCounter = false; | 755 isFirstCounter = false; |
| 756 String str(toRenderText(child)->text()); | 756 String str(toRenderText(child)->text()); |
| 757 stream << str; | 757 stream << str; |
| 758 } | 758 } |
| 759 } | 759 } |
| 760 } | 760 } |
| 761 | 761 |
| 762 String counterValueForElement(Element* element) | 762 String counterValueForElement(Element* element) |
| 763 { | 763 { |
| 764 // Make sure the element is not freed during the layout. | 764 // Make sure the element is not freed during the layout. |
| 765 RefPtrWillBeRawPtr<Element> protector(element); | 765 RefPtrWillBeRawPtr<Element> protector(element); |
| 766 element->document().updateLayout(); | 766 element->document().updateLayout(); |
| 767 TextStream stream; | 767 TextStream stream; |
| 768 bool isFirstCounter = true; | 768 bool isFirstCounter = true; |
| 769 // The counter renderers should be children of :before or :after pseudo-elem
ents. | 769 // The counter renderers should be children of :before or :after pseudo-elem
ents. |
| 770 if (RenderObject* before = element->pseudoElementRenderer(BEFORE)) | 770 if (LayoutObject* before = element->pseudoElementRenderer(BEFORE)) |
| 771 writeCounterValuesFromChildren(stream, before, isFirstCounter); | 771 writeCounterValuesFromChildren(stream, before, isFirstCounter); |
| 772 if (RenderObject* after = element->pseudoElementRenderer(AFTER)) | 772 if (LayoutObject* after = element->pseudoElementRenderer(AFTER)) |
| 773 writeCounterValuesFromChildren(stream, after, isFirstCounter); | 773 writeCounterValuesFromChildren(stream, after, isFirstCounter); |
| 774 return stream.release(); | 774 return stream.release(); |
| 775 } | 775 } |
| 776 | 776 |
| 777 String markerTextForListItem(Element* element) | 777 String markerTextForListItem(Element* element) |
| 778 { | 778 { |
| 779 // Make sure the element is not freed during the layout. | 779 // Make sure the element is not freed during the layout. |
| 780 RefPtrWillBeRawPtr<Element> protector(element); | 780 RefPtrWillBeRawPtr<Element> protector(element); |
| 781 element->document().updateLayout(); | 781 element->document().updateLayout(); |
| 782 | 782 |
| 783 RenderObject* renderer = element->renderer(); | 783 LayoutObject* renderer = element->renderer(); |
| 784 if (!renderer || !renderer->isListItem()) | 784 if (!renderer || !renderer->isListItem()) |
| 785 return String(); | 785 return String(); |
| 786 | 786 |
| 787 return toRenderListItem(renderer)->markerText(); | 787 return toRenderListItem(renderer)->markerText(); |
| 788 } | 788 } |
| 789 | 789 |
| 790 } // namespace blink | 790 } // namespace blink |
| OLD | NEW |