See
http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/modules/libpr0n/public/imgILoader.idl&rev=1.14&mark=79-82#78
You're trying to use an interface from Javascript that really wasn't
intended for that use; it's impossible to safely call that interface
from Javascript because of the way XPConnect works.
For Javascript, I'd probably recommend something like the following:
var img = new Image();
img.onload = function() {alert(img.width + "x" + img.height);};
img.src="http://www.example.com/image.png";
(http://www.devguru.com/Technologies/ecmaScript/quickref/image.html is
one reference on the image object.)
No XPConnect required.
-Eli
Edwin K wrote:
Hi,
I am trying to determine from within a Javascript XPComponent the size
of a set
of images. I have just started to learn about the internals of
Mozilla/
Firefox and based on the information collected on the web, here is
what my code looks like[ 1 ].
My problem is that this does not work consistently: I sometimes works
for some images. It
sometimes crashes the browser (I think when the number of concurrent
requests is too high??).
I was wondering if someone has done this before or is familiar enough
with the internals of firefox to point me where my mistake is.
Thank you!!!!
-Edwn
////////////////////////////////////////////
// Image Utils //
////////////////////////////////////////////
var ImageUtils = function()
{
function newURI( url )
{
var ioService =
Components.classes["@mozilla.org/network/io-service;
1"]
.getService()
.QueryInterface( Components.interfaces.nsIIOService );
return ioService.newURI(url, null, null);
}
var imgLoader = Components.classes["@mozilla.org/image/loader;1"]
.getService()
.QueryInterface(
Components.interfaces.imgILoader );
var workingSet = {};
var that = {};
that.askImageSize = function( url, callbackFunc )
{
// somebody has already requested this image
if( workingSet[ url ] != null )
{
workingSet[ url ].push( callbackFunc );
return;
}
var uri = newURI( url );
$debug( "Asked size information for: " + uri.spec );
workingSet[ uri.spec ] = [ callbackFunc ];
imgLoader.loadImage( uri, uri, uri, null, that, null, null,
null,
null );
}
// imgIDecoderObserver
that.onDataAvailable = function(){ $debug( "onDataAvailable" ) };
that.onStartDecode = function(){ $debug( "onStartDecode" ) };
that.onStartFrame = function(){ $debug( "onStartFrame" ) };
that.onStopContainer = function(){ $debug( "onStopContainer" ) };
that.onStopFrame = function(){ $debug( "onStopFrame" ) };
that.onStopDecode = function ( request, status, statusArg )
{
$debug( "onStopDecode:" + status + ".." + statusArg );
};
that.onStartContainer = function (request, container )
{
$debug( "onStartContainer" );
// extract size information
var url = request.URI.spec; // we encoded the image
url in the
title
var width = container.width;
var height = container.height;
$debug( "Ruler: " + url + " = " + width + " x " + height );
var requestors = workingSet[ url ];
if( requestors == null )
$debug( "BUG: There is now requestors for: " + url );
else
for( var i = 0; i < requestors.length; i++ )
requestors[ i ].call( this, url, width, height
);
}
that.runUnitTests = function()
{
function getImageSize( aURL )
{
that.askImageSize( aURL,
function( url,
width, height )
{
$debug( "The result is:" +
url + " -- w:"+ width + " -- h: "
+ height );
}
);
}
getImageSize( "http://flickr.com/photo_zoom.gne?
id=384986014&size=o" );
// getImageSize( "http://flickr.com/photo_zoom.gne?
id=344620838&size=o" );
// getImageSize( "http://flickr.com/photo_zoom.gne?
id=344620839&size=o" );
// getImageSize( "http://flickr.com/photo_zoom.gne?
id=344620840&size=o" );
// getImageSize( "http://www.techcrunch.com/wp-content/
photobucketlogo210.gif" );
}
return that;
}();
_______________________________________________
dev-tech-layout mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-layout