dump tree

来源:互联网 发布:手机照片编制软件 编辑:程序博客网 时间:2024/06/08 01:00

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:

//Rendervoid showRenderObject(RenderObject* renderObject, int depth){    char buffer[128] = {0};    int pos = 0;    if (!renderObject)    {         pos += sprintf(buffer+pos,"%s","null");    }else    {        for (int i = 0; i<depth; i++)            pos += sprintf(buffer+pos,"%s"," ");        pos += sprintf(buffer+pos, "%s ", renderObject->renderName());        //sprintf(buffer+pos, "%s", )        if (renderObject->node())        {            pos += sprintf(buffer+pos, "%s", renderObject->node()->nodeName().utf8().data());        }else        {            pos += sprintf(buffer+pos, "%s", "noname");        }if (renderObject->isRenderBlock()){RenderBlock *block = (RenderBlock*)(renderObject);pos += sprintf(buffer+pos, "(%d,%d,%d,%d)", block->x(),block->y(),block->width(),block->height());}//else if (renderObject->isRender)    }    LOG(Loading,"%s",buffer);}void visitRenderNode(RenderObject * renderNode, int depth){    showRenderObject(renderNode, depth);    if (!renderNode)        return;    for (RenderObject* child = renderNode->firstChild();        child; child=child->nextSibling())        {        visitRenderNode(child,depth+1);    }    }void dumpRenderNode(RenderObject * renderNode, int depth){    visitRenderNode(renderNode, depth);}

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:

void showDomNode(const Node* node, int depth){    char buffer[128] = {0};    int pos = 0;    if (!node)    {         pos += sprintf(buffer+pos,"%s","null");    }else    {        for (int i = 0; i<depth; i++)            pos += sprintf(buffer+pos,"%s"," ");        pos += sprintf(buffer+pos, "%s", node->nodeName().utf8().data());        //sprintf(buffer+pos, "%s", )    }    LOG(Loading,"%s",buffer);}void visitDomNode(Node * node, int depth){    showDomNode(node,depth);    if (!node)        return;    for (Node* child = node->firstChild();        child; child=child->nextSibling())    {        visitDomNode(child,depth+1);    }    }void dumpDomNode(Node * node, int depth){    visitDomNode(node,depth);}

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.


原创粉丝点击