[webkit-reviews] review requested: [Bug 11610] XMLHttpRequest.onreadystatechange doesn't provide access to the request object : [Attachment 11865] proposed fix

bugzilla-request-daemon at macosforge.org bugzilla-request-daemon at macosforge.org
Fri Dec 15 11:31:17 PST 2006


Alexey Proskuryakov <ap at webkit.org> has asked  for review:
Bug 11610: XMLHttpRequest.onreadystatechange doesn't provide access to the
request object
http://bugs.webkit.org/show_bug.cgi?id=11610

Attachment 11865: proposed fix
http://bugs.webkit.org/attachment.cgi?id=11865&action=edit

------- Additional Comments from Alexey Proskuryakov <ap at webkit.org>
(In reply to comment #8)
> I don't like the fact that adding any new classes derived from EventTarget
will
> require changes to the toJS function in kjs_dom.cpp. Is there any way we can
do
> better?

  I have made it more symmetrical by adding a toXMLHttpRequest() method to
EventTarget. I don't see how it could automatically support new subclasses -
and other toJS functions (for Document, Node, etc.) have same or similar
design.

> Also, is there a way we can avoid adding code to kjs_dom.cpp -- where's the
> newfangled place for code like this?

  All other toJS() functions are also in kjs_* files now, except for a single
static one in JSCanvasRenderingContext2DCustom.cpp.

> Can someone rename intenalHeaderContent to internalHeaderContent?

  OK.

> As for all the functions in EventTarget that call isNode, why not use virtual

> functions for that?
> 
> If you don't want EventTarget's ref() and deref() themselves to be virtual
you
> can have them be inlines that call pure virtual functions. I think if you
> design EventTarget properly you won't have to have any code except for the
> JavaScript binding that uses isNode().

  I have actually removed isNode() in favor of directly calling
toNode()/toXMLHttpRequest().

  Implemented ref()/deref() as discussed on IRC, but actually defined them in
the header, even though they won't be inlined. I think that this will improve
readability, since the design is not particularly obvious.

> I haven't yet given up hope of sharing some of the event dispatch code, but
> that can wait.
> 
> Since toNode returns 0 if it's not a node, I think functions that call both
> isNode and toNode should perhaps be changed to just call toNode and check for

> nil.

  Done (removed isNode() altogether).

> +	   if (!element || (evt->target() &&
> element->contains(evt->target()->toNode())))
> 
> Why this new check for a nil target? When can that happen?

  The check used to be in HTMLElement::contains(); I don't know if this can
happen, but I wanted to preserve the semantics intact.

> +	   Event* evt = new Event(readystatechangeEvent, true, true);
> 
> This should be a RefPtr, and you should call release when calling
handleEvent.
> It's not good to rely on the fact that setTarget and setCurrentTarget won't
> ref/deref. This idiom occurs two more times a few lines later.

  Done (but with get() instead of release() - handleEvent() doesn't take
ownership AFAICT).

> +    using Shared<XMLHttpRequest>::ref;
> +    using Shared<XMLHttpRequest>::deref;
> 
> I believe you can just say using Shared::ref here.

  I think this shortcut can only be used for template parameters of the class
itself, not for its superclasses. I tried, but it didn't work.



More information about the webkit-reviews mailing list