[webkit-dev] DOM tree surgery and DOM tree destruction

Pitaga achats at avvanta.com
Wed Jun 25 12:16:19 PDT 2008


Thanks very much for this response.

We (my co-workers and I) want to use WebKit modules selectively, without 
running anything like full browser sessions. Over time, we'll do this as 
cleanly as we can, taking full advantage of smart pointers. For now, we're 
focused on implementing our own (non-trivial) algorithms. We're breaking 
into browser sessions, running our algorithms on DOM trees, and worrying as 
little as possible about API issues. We're more than willing to write code 
to destroy objects. We're coping with smart pointers, rather than taking 
advantage of them. If this seems like the wrong attitude, please excuse us 
on the grounds that it's appropriate for us to focus first on algorithm 
implementation.

Given that we're interfering with the mechanisms for automatic destruction, 
and need to write code to destroy trees, how do we do this?

Given that we're interfering with mechanisms for automatic destruction, my 
question on best practice for using raw pointers, RefPtr's, and PassRefPtr's 
in the surgery example may be ill-conceived. But when we're ready to use 
smart pointers intelligently, we'd like our algorithm methods to need as 
little recoding as possible. So let me ask some more specific questions 
anyway.

A is a node pointer parameter of method M. A corresponds to a subtree of T 
(where T is a DOM tree corresponding to a parsed Web page). Inside M, N is a 
node pointer to which the output of createElement (suitably cast) will be 
assigned. X, Y, and W are nodes underneath A (at whatever level of descent). 
I'm going to find X, Y, and W by traversing the subtree dominated by A with 
firstChild and nextSibling calls, assigning to a local node pointer variable 
L and applying tests as I go. (By assumption, there's guaranteed to be one 
each of X, Y, and W, and Y will be the only child of X). I'm going to 
interpose N between X and Y, as the child of X and the parent of Y, using 
removeChild and appendChild. I'm going to remove W and all its descendants 
from T using removeChild, and destroy them. After I call M, I'm going to 
manually destroy T.

How should A be declared in the method that calls M?

How should A be supplied to M?

How should N be declared inside M?

How should L be declared inside M?

When I find X, it will be assigned to L. How do I call removeChild on L with 
a parameter corresponding to firstChild of L? How do I call appendChild on L 
with a parameter corresponding to N? How do I call appendChild on N with a 
parameter corresponding to firstChild of L?

When I find W, its parent will be assigned to L. How do I call removeChild 
on L with a parameter corresponding to the appropriate child of L? How do I 
make sure that the removed child and its descendants are destroyed?

How do I destroy T?

These are questions about smart pointers, and about destruction, not about 
tree traversal and tree surgery. I'll be grateful for any further help.

Pitaga

----- Original Message ----- 
From: "Darin Adler" <darin at apple.com>
To: "Pitaga" <achats at avvanta.com>
Cc: <webkit-dev at lists.webkit.org>
Sent: Wednesday, June 25, 2008 10:15 AM
Subject: Re: [webkit-dev] DOM tree surgery and DOM tree destruction


> On Jun 25, 2008, at 10:06 AM, Pitaga wrote:
>
>> For example, suppose that a browser based on WebKit has loaded a Web 
>> page and parsed it, producing a DOM tree T. As an exercise, I want  to 
>> perform surgery on T and then destroy both T and the constituents  that 
>> the surgery removed from T, without leaking. For purposes of  this 
>> exercise, the browser session itself is of no interest.
>
> You don't explicitly destroy anything. DOM objects will be destroyed  when 
> the last owner goes away; that's what reference counting is used  for.
>
> So "How do I destroy the tree?" is the wrong question. If there's a  test 
> case where something's not getting destroyed, you could ask "Why  isn't it 
> being destroyed?" but there's no need to write code to  explicitly destroy 
> anything.
>
>> What's the best practice here with respect to raw pointers, 
>> PassRefPtr's, and RefPtr's?
>
> That question is too vague and broad for me to answer. Maybe you could 
> ask a more specific question?
>
>> How do I destroy the subtree dominated by W after I remove it?
>
> I had a lot of trouble following the letters in your example, so I'm  not 
> sure about "W" or even what "dominated" means.
>
> Generally if you remove a child with removeChild, then that child and  all 
> its descendants will be destroyed when the last reference to it  goes 
> away. Typically you are holding a RefPtr to the child you are  removing; 
> in that case the most likely time it will be destroyed is  when that 
> RefPtr goes out of scope. Or you might only have a raw  pointer. In that 
> case, it's likely the child will destroyed within the  removeChild 
> function.
>
>> How do I destroy T when I'm all finished?
>
> You say that "WebKit has loaded a web page and parsed it [to produce  T]". 
> Given that, T is a document and it's owned by the Frame that  loaded it. 
> As long as its the current document in that Frame it will  be kept alive. 
> When the Frame either goes away or loads a new  document, then it will be 
> destroyed, unless someone else is holding a  reference to it. When the 
> last reference to it goes away, it will be  destroyed.
>
>     -- Darin
> 



More information about the webkit-dev mailing list