W3C home > Mailing lists > Public > www-svg@w3.org > October 2003

Re: externalResourcesRequired and SVGLoad

From: Gavin Kistner <gavin@refinery.com>
Date: Thu, 23 Oct 2003 10:26:14 -0600
Cc: <www-svg@w3.org>
To: "Denis Bohm" <denis@fireflydesign.com>
Message-Id: <9F16CA46-0575-11D8-8A8A-0003937E984E@refinery.com>

On Thursday, October 23, 2003, at 09:50  AM, Denis Bohm wrote:
> I would like to create an element with a reference to an external  
> resource after the document has been loaded from JavaScript (possibly  
> on a user initiated event).  [...] So I would like an event that is  
> triggered when the external resource has been loaded [...] Will the  
> wording cover this situation?

It was your desire that sparked me looking at this. I hadn't realized  
that you were dynamically creating the element, though IMO what you  
desire should be made possible by the UA. Code like the following  
should (IMHO) fire the Loaded() function only after that element has  
been loaded from the url:

function ThisIsCalledAfterTheDocumentIsLoaded(){
	var foo = svgDoc.createElement('use');
	foo.addEventListener('load',Loaded,false);
	foo.setAttribute('externalResourcesRequired','true');
	foo.setAttributeNS('http://www.w3.org/1999/ 
xlink','xlink:href','bar.svg#foo');
	svgDoc.documentElement.appendChild(foo);
}



However, I can see how this could get 'tricky' if the UA loaded the url  
asynchronously, as soon as it was set. Should the below code fire the  
load event, when the SVGLoad handler is attached to the object after it  
has fully loaded?

function ThisIsCalledAfterTheDocumentIsLoaded(){
	var foo = svgDoc.createElement('use');
	foo.setAttribute('id','foo');
	foo.setAttribute('externalResourcesRequired','true');
	foo.setAttributeNS('http://www.w3.org/1999/ 
xlink','xlink:href','bar.svg#foo');
	svgDoc.documentElement.appendChild(foo);
}

function ThisIsCalledFiveMinutesLater(){
	svgDoc.getElementById('foo').addEventListener('load',Loaded,false);
}

(IMHO the answer is no, the SVGLoad event should not fire in the above  
case.)




What about this code, if the referenced URL is already cached and  
fetched before the SVGLoad handler is attached?

function ThisIsCalledAfterTheDocumentIsLoaded(){
	var foo = svgDoc.createElement('use');
	svgDoc.documentElement.appendChild(foo);
	foo.setAttributeNS('http://www.w3.org/1999/ 
xlink','xlink:href','bar.svg#foo');
	foo.addEventListener('load',Loaded,false);
	foo.setAttribute('externalResourcesRequired','true');
}

(IMHO the answer is "Dude, you're just asking for trouble.")




Denis, in case the savvy ASV developers have implemented the xlink:href  
fetching asynchronously, have you tried ensuring that your code is as  
the first example, setting the SVGLoad handler before the xlink:href?



The sample wording I previously supplied may or may not be interpreted  
to cover your desired case. Frankly, given the issues I've raised above  
regarding asynchronous fetching, I think:

* a decision needs to be made on how to handle asynchronous fetching of  
external resources created dynamically via code:
	-- externalResourcesRequired="true" -> synchronous ?
	-- externalResourcesRequired="false" -> asynchronous ?
	-- what if the externalResourcesRequired flag is set during an  
asynchronous fetch?

* a decision needs to be made on how to handle an SVGLoad event  
dynamically attached to an object after it has finished loading:
	-- should it fire immediately?
	-- never?
	-- only if any externalResources are changed and loaded?

* the results of these decisions needs to be included explicitly in the  
1.2 specs.


--
Gavin Kistner @ Refinery, Inc.
gavin@refinery.com
work: +1.303.444.1777
Received on Thursday, 23 October 2003 12:33:13 GMT

This archive was generated by hypermail 2.3.1 : Friday, 8 March 2013 15:54:26 GMT