- From: Laurens Holst <lholst@students.cs.uu.nl>
- Date: Mon, 04 Jun 2007 19:47:32 +0900
- To: Boris Zbarsky <bzbarsky@MIT.EDU>
- CC: "public-html@w3.org" <public-html@w3.org>
- Message-ID: <4663EDC4.1040900@students.cs.uu.nl>
Boris Zbarsky schreef:
>> This is very fast O(log n) worst-time, and often faster. And you
>> don’t need to evaluate it very often.
>
> It needs to be either evaluated every time someone sets .src on an
> image or cached on images. The first way makes an O(1) operation
> (image swapping) O(log N), while the second one makes the memory usage
> much bigger.
>
> Not to mention all the other elements that use URI attributes...
I don’t think this is really a big deal. O(1) is obviously better than
O(log n), but O(log n) is still fast. And how recursively looking up
some value would make memory usage ‘much bigger’ I don’t know. It’s just
a few more things on the stack, that’s all?
Also, in your case of image swapping, there is network overhead for
retrieving the new image. This way outweighs the insignificant extra
time it takes to perform the O(log n) operation for resolving the baseURI.
> Note that none of this involved _modifying_ xml:base attributes. When
> that happens, things are really bad. But even their mere existence
> makes modification of other attributes and moving of nodes in the DOM
> more expensive.
I talked about this with Anne van Kesteren in a private conversation,
and what I concluded was:
* Nowhere is it specified that this should actually happen. *
The DOM 3 Core specification ONLY states that the baseURI property has
to be dynamic. That is, it should use a getter and implement the method
I mentioned before. However, DOM 3 Core nor DOM 2 HTML nor XML Base
specify anything about whether HTML elements that use baseURI should
re-evaluate their URI values (like src, href) when the base URI changes.
This is in fact how we’ve implemented baseURI in Backbase about a year
ago (and do consider that Backbase is implemented in Javascript, not
C++!), and it doesn’t seem that this is causing us performance problems
of any kind. We decided not to do any kind of dynamic updates to
elements like <img> because not implementing a complex system through
events to handle those updates was the easy (and fast) way out at that
time :), and I guess I still agree with that.
In other words, I should’ve left the whole section about events and
listeners and re-evaluation of URLs out of my original mail, because
it’s only making things more complex where they don’t need to be.
>> Note that this handler already exists because <img> tags and such
>> needs to respond to changes to the HTML Base element.
>
> Do they? I don't believe UAs do that.
They don’t. It was merely an assumption that I made on what seemed
logical, but apparantly UAs don’t do what’s logical in the case of HTML
Base :).
I did some testing:
The current implementation of Firefox does not resolve baseURI
dynamically. Instead, it seems baseURI is a constant which is set on
every element while parsing. Note that contrary to your statement in
your followup-mail to Henrik Dvergsdal’s message ("you'll note that
Firefox doesn't implement xml:base for XHTML"), Firefox *does* support
xml:base.
The current implementation of IE does of course not support baseURI,
however when I modify the <base> element’s href attribute and re-set the
test-image’s src attribute, it does reload the image relative to the new
base URL (this does not happen in Firefox). Without re-setting the image
path, the image is not re-evaluated.
Opera seems to behave the same way as IE.
It seems Firefox is a bit off here, and that the logical extension of IE
and Opera’s implementation to support xml:base would go the same way as
Backbase’s implementation.
----------
I guess Firefox’s current behaviour is that while it’s parsing, it
creates a constant baseURI attribute for each element. According to the
DOM 3 Core specification, it should instead implement a getter with the
earlier mentioned recursive lookup method instead (or update the entire
subtree when xml:base or <base> is modified and nodes are moved, but
that doesn’t seem very efficient).
Any overhead because the retrieval operation changes from O(1) to O(log
n) will probably not be noticable, because 1. the current method has an
initial O(n) operation and the dynamic method has not, so that will kind
of cancel eachother out, and 2. any overhead of O(log n) compared to
O(1) will be insignificant because the result would be an HTTP retrieval
operation. <a>’s href attribute will only be retrieved upon user
interaction, so there’s also no problem there.
Finally, if you really want to you can optimise the whole baseURI
implementation by making the getter check for a global flag which
indicates whether "xml:base" is used anywhere. If it’s not, instead of
returning parent.baseURI and go upwards through the tree, just directly
return document.baseURI. This should negate any negative impact on
existing documents that you would be afraid of.
----------
To conclude, HTML5 has an opportunity here to specify the behaviour of .
There’s two options:
1. Not automatically reload resources when base URIs change, unless they
are normally evaluated (e.g. <img>’s src attribute is re-set, or mouse
clicks on or hovers over link). This is the current behaviour of IE and
Opera, and also the simplest to implement, and probably also the fastest.
2. Automatically reloading resources when base URIs change. This would
be the most logical behaviour, although it’s harder to implement and
probably slow. One could argue that as changing the base URI would
result in massive HTTP retrieval operations anyway, it’s going to be
slow in any case. One should also wonder whether there’s really any use
case for this.
3. Not support dynamic operations of any kind on base URIs. This is the
current behaviour of Firefox’s.
~Grauw
--
Ushiko-san! Kimi wa doushite, Ushiko-san nan da!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Laurens Holst, student, university of Utrecht, the Netherlands.
Website: www.grauw.nl. Backbase employee; www.backbase.com.
Received on Monday, 4 June 2007 10:48:19 UTC