views:

444

answers:

3

I've set a ondrop event on my drop area and it receives an event when I drag an image from my desktop to the drop area.

However, according to the Recommended_Drag_Types document:

https://developer.mozilla.org/en/DragDrop/Recommended_Drag_Types

A local file is dragged using the application/x-moz-file type with a data value that is an nsIFile object. Non-privileged web pages are not able to retrieve or modify data of this type.

That makes sense, but how do I prompt the user to escalate privileges to get access to the file data and send it via an XMLHttpRequest?

If I try it without escalating privileges when I do this code:

event.dataTransfer.mozSetDataAt("application/x-moz-file", file, 0);

Javascript returns this error:

Permission denied for domain.com to create wrapper for object of class UnnamedClass

The only article I can find on this is one from 2005 but I can't tell if the directions still apply to Firefox 3, it suggest doing this:

netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

which doesn't seem to work.

A: 

If you haven't upgraded to 3.5 yet, you can use the dragdropupload extension.

MiffTheFox
Thanks, but I'm thinking of this from more of a web developer perspective, I figure most people will upgrade to Firefox v3.5 but much fewer will have this extension installed.
bertrandom
A: 

Hi! I've faced exactly the same problem with Firefox 3.5 - and no answer or other reports on this apart from yours. This is really strange.... Moreover, I was not able to found any sort of documentation on how to escalate privileges... Strange, Mozilla docs clearly say that we can handle file drops from Firefox 3.5 right into webpage...

I will appreciate any sort of information on that topic!

A: 

Hi!

I found out that if instead of escalating privileges globally:

    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
    ...
    function doDrop(event) {
       ...
       var file = event.dataTransfer.mozGetDataAt("application/x-moz-file", 0);
       ...
    }

I escalate privileges in the function's body:

    ...
    function doDrop(event) {

       netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
       ...
       var file = event.dataTransfer.mozGetDataAt("application/x-moz-file", 0);
       ...
    }

I get rid of the error you described and gain access to the nsIFile instance I was looking for.

ggrussenmeyer