dump tree

There are code in webkit that can dump the dom tree and render tree.

"RenderObject::showRenderTreeAndMark" and "Node::showTreeAndMark"

You can use it or change it. But it will take a lot of time to compile, and the log function doesn't work very well in Windows environment.

Below is the simplified code and will work well on Windows:

DumpRenderNode:

  1. //Render  
  2. void showRenderObject(RenderObject* renderObject, int depth)  
  3. {  
  4.     char buffer[128] = {0};  
  5.     int pos = 0;  
  6.     if (!renderObject)  
  7.     {   
  8.         pos += sprintf(buffer+pos,"%s","null");  
  9.     }else  
  10.     {  
  11.         for (int i = 0; i<depth; i++)  
  12.             pos += sprintf(buffer+pos,"%s"," ");  
  13.         pos += sprintf(buffer+pos, "%s ", renderObject->renderName());  
  14.         //sprintf(buffer+pos, "%s", )  
  15.         if (renderObject->node())  
  16.         {  
  17.             pos += sprintf(buffer+pos, "%s", renderObject->node()->nodeName().utf8().data());  
  18.         }else  
  19.         {  
  20.             pos += sprintf(buffer+pos, "%s""noname");  
  21.         }  
  22.         if (renderObject->isRenderBlock())  
  23.         {  
  24.             RenderBlock *block = (RenderBlock*)(renderObject);  
  25.             pos += sprintf(buffer+pos, "(%d,%d,%d,%d)", block->x(),block->y(),  
  26.                 block->width(),block->height());  
  27.         }//else if (renderObject->isRender)  
  28.   
  29.     }  
  30.     LOG(Loading,"%s",buffer);  
  31. }  
  32. void visitRenderNode(RenderObject * renderNode, int depth)  
  33. {  
  34.     showRenderObject(renderNode, depth);  
  35.     if (!renderNode)  
  36.         return;  
  37.     for (RenderObject* child = renderNode->firstChild();  
  38.         child; child=child->nextSibling())      
  39.     {  
  40.         visitRenderNode(child,depth+1);  
  41.     }      
  42. }  
  43. void dumpRenderNode(RenderObject * renderNode, int depth)  
  44. {  
  45.     visitRenderNode(renderNode, depth);  
  46. }  


result:

lyftest begin dump
RenderView #document(0,0,936,473)
 RenderBlock HTML(0,0,936,473)
  RenderBody BODY(8,8,920,449)
   RenderBlock P(0,0,920,18)
    RenderText #text
   RenderBlock (anonymous) noname(0,34,920,0)
    RenderImage IMG
   RenderBlock DIV(0,34,920,24)
    RenderText #text
   RenderBlock UL(0,74,920,54)
    RenderListItem LI(40,0,880,18)
     RenderListMarker noname
     RenderText #text
    RenderListItem LI(40,18,880,18)
     RenderListMarker noname
     RenderText #text
    RenderListItem LI(40,36,880,18)
     RenderListMarker noname
     RenderText #text
lyftest end dump

 

dump DOM node:

  1. void showDomNode(const Node* node, int depth)  
  2. {  
  3.     char buffer[128] = {0};  
  4.     int pos = 0;  
  5.     if (!node)  
  6.     {   
  7.         pos += sprintf(buffer+pos,"%s","null");  
  8.     }else  
  9.     {  
  10.         for (int i = 0; i<depth; i++)  
  11.             pos += sprintf(buffer+pos,"%s"," ");  
  12.         pos += sprintf(buffer+pos, "%s", node->nodeName().utf8().data());  
  13.         //sprintf(buffer+pos, "%s", )  
  14.     }  
  15.     LOG(Loading,"%s",buffer);  
  16. }  
  17. void visitDomNode(Node * node, int depth)  
  18. {  
  19.     showDomNode(node,depth);  
  20.     if (!node)  
  21.         return;  
  22.     for (Node* child = node->firstChild();  
  23.         child; child=child->nextSibling())  
  24.     {  
  25.         visitDomNode(child,depth+1);  
  26.     }      
  27. }  
  28. void dumpDomNode(Node * node, int depth)  
  29. {  
  30.     visitDomNode(node,depth);  
  31. }  


result:

lyftest begin dump
#document
 html
 HTML
  HEAD
   #text
   TITLE
    #text
   #text
   META
   #text
   META
   #text
   META
   #text
   META
   #text
  #text
  BODY
   #text
lyftest end dump

 

with this we can do more on it.

posted @ 2012-05-30 23:52  cascais  阅读(268)  评论(0编辑  收藏  举报