FAQ XUL
FAQ XULConsultez toutes les FAQ
Nombre d'auteurs : 2, nombre de questions : 23, dernière mise à jour : 14 juin 2021
- Comment utiliser un composant XPCom ?
- Comment convertir une chaine en UTF-8 ?
- Comment convertir un noeud XML en chaine de caractères ?
- Comment convertir une chaîne de caractères en noeud XML ?
- Comment récupérer le chemin du répertoire personnel de l'utilisateur ?
- Comment tester la présence d'un fichier local ?
- Comment lire un fichier local ?
- Comment écrire dans un fichier local ?
- Comment parser un fichier XML local ?
- Comment exporter un noeud XML dans un fichier local ?
- Comment lire les cookies ?
- Comment créer un cookie ?
- Comment exécuter une ligne de commande ?
- Comment afficher un message dans la console d'erreur ?
Pour pouvoir utiliser un objet XPCom dans l'une de vos pages, il faut déjà être en mode chrome (pour les extensions). Ensuite, il faut ajouter cette ligne en début de script.
netscape.
security.
PrivilegeManager.enablePrivilege
(
"UniversalXPConnect"
);
Par ailleurs, il vous faut connaitre le Contract ID du composant, et l'interface avec laquelle vous souhaitez l'utilisez. Avec ces informations, vous pouvez souvent l'instancier ainsi :
var mon_composant =
Components.
classes[
Contract_ID]
.createInstance
(
Interface_souhaitee);
Si vous récupérer des informations dans un site qui ne possède pas le même encodage que votre extension, il peut être utile de convertir le résultat.
Voici un exemple qui vous permettra de stocker un noeud XML dans une chaine de caractères.
Voici un exemple qui vous permettra de parser une chaine de caractères dans un noeud XML.
Pour enregistrer des préférences pour une prochaine utilisation, il peut être utile de connaître l'emplacement du répertoire personnel de l'utilisateur courant.
function home_dir
(
) {
var dirService =
Components.
classes[
"@mozilla.org/file/directory_service;1"
]
.getService
(
Components.
interfaces.
nsIProperties);
var home
=
dirService.get
(
"Home"
,
Components.
interfaces.
nsIFile)
.QueryInterface
(
Components.
interfaces.
nsILocalFile)
.
path;
return home
;
}
Voici un exemple qui vous permettra de tester la présence d'un fichier local.
Voici un exemple qui vous permettra de lire un fichier local, et de récupérer son contenu ligne par ligne dans un tableau.
function read_file
(
filepath) {
var aFile =
Components.
classes[
"@mozilla.org/file/local;1"
]
.createInstance
(
Components.
interfaces.
nsILocalFile);
aFile.initWithPath
(
filepath);
if (
aFile.exists
(
)) {
var aStream =
Components.
classes[
"@mozilla.org/network/file-input-stream;1"
]
.createInstance
(
Components.
interfaces.
nsIFileInputStream);
aStream.init
(
aFile,
0x01
,
0444
,
null);
aStream.QueryInterface
(
Components.
interfaces.
nsILineInputStream);
var hasmore =
true;
var tab =
new Array(
),
i=
0
;
while (
hasmore) {
var line =
{};
hasmore =
aStream.readLine
(
line);
tab[
i]
=
line.
value;
i++;
}
aStream.close
(
);
return tab;
}
}
Voici un exemple qui vous permettra d'écrire une ligne dans un fichier local.
function write_file
(
filepath,
str)
{
var aFile =
Components.
classes[
"@mozilla.org/file/local;1"
]
.createInstance
(
Components.
interfaces.
nsILocalFile);
aFile.initWithPath
(
filepath);
var aStream =
Components.
classes[
'@mozilla.org/network/file-output-stream;1'
]
.createInstance
(
Components.
interfaces.
nsIFileOutputStream);
aStream.init
(
aFile,
0x02
|
0x08
|
0x20
,
0777
,
null);
aStream.write
(
str,
str.
length);
aStream.close
(
);
}
Voici un exemple qui vous permettra de lire un fichier local, et de récupérer son contenu dans un noeud XML.
function parse_file
(
filepath,
encoding)
{
var aFile =
Components.
classes[
"@mozilla.org/file/local;1"
]
.createInstance
(
Components.
interfaces.
nsILocalFile);
aFile.initWithPath
(
filepath);
if (
aFile.exists
(
)) {
var aStream =
Components.
classes[
"@mozilla.org/network/file-input-stream;1"
]
.createInstance
(
Components.
interfaces.
nsIFileInputStream);
aStream.init
(
aFile,
0x01
,
0444
,
null);
var domParser =
Components.
classes[
"@mozilla.org/xmlextras/domparser;1"
]
.getService
(
Components.
interfaces.
nsIDOMParser);
var root =
domParser.parseFromStream
(
aStream,
encoding,
aFile.
fileSize,
"text/xml"
);
aStream.close
(
);
return root;
}
}
Voici un exemple qui vous permettra de stocker un noeud XML dans un fichier local.
function write_fileXML
(
filepath,
node)
{
var aFile =
Components.
classes[
"@mozilla.org/file/local;1"
]
.createInstance
(
Components.
interfaces.
nsILocalFile);
aFile.initWithPath
(
filepath);
var aStream =
Components.
classes[
'@mozilla.org/network/file-output-stream;1'
]
.createInstance
(
Components.
interfaces.
nsIFileOutputStream);
aStream.init
(
aFile,
0x02
|
0x08
|
0x20
,
0777
,
null);
var tmp =
Components.
classes[
"@mozilla.org/xmlextras/xmlserializer;1"
]
.createInstance
(
Components.
interfaces.
nsIDOMSerializer);
tmp.serializeToStream
(
node,
aStream,
"iso-8859-1"
);
aStream.close
(
);
}
Voici un exemple qui vous permettra de récupérer des informations stockées dans un cookie.
function get_cookies_from_host
(
hostname,
name
)
{
var cookieManager =
Components.
classes[
"@mozilla.org/cookiemanager;1"
]
.getService
(
Components.
interfaces.
nsICookieManager);
var iter =
cookieManager.
enumerator;
while (
iter.hasMoreElements
(
))
{
var cookie =
iter.getNext
(
);
if (
cookie instanceof Components.
interfaces.
nsICookie)
{
if (
cookie.
host ==
hostname)
{
if (
cookie.
name
==
name
)
{
return cookie.
value;
}
}
}
}
}
Pour effectuer cette opération, il vous suffit d'utiliser le gestionnaire de cookies intégré à XpCom dans son interface non figée nsICookieManager2
Voici la méthode intéressante :
/* Add a cookie. nsICookieService is the normal way to do this. This
* method is something of a backdoor.
*
* @param aDomain
* the host or domain for which the cookie is set. presence of a
* leading dot indicates a domain cookie; otherwise, the cookie
* is treated as a non-domain cookie. see RFC2109.
* @param aPath
* path within the domain for which the cookie is valid
* @param aName
* cookie name
* @param aValue
* cookie data
* @param aIsSecure
* true if the cookie should only be sent over a secure connection.
* @param aIsHttpOnly
* true if the cookie should only be sent to, and can only be
* modified by, an http connection.
* @param aIsSession
* true if the cookie should exist for the current session only.
* see aExpiry.
* @param aExpiry
* expiration date, in seconds since midnight (00:00:00), January 1,
* 1970 UTC. note that expiry time will also be honored for session cookies;
* in this way, the more restrictive of the two will take effect.
*/
void add
(
in AUTF8String aDomain,
in AUTF8String aPath,
in ACString aName,
in ACString aValue,
in boolean aIsSecure,
in boolean aIsHttpOnly,
in boolean aIsSession,
in PRInt64 aExpiry);
Pensez bien à signaler les chemins absolus de la commande que vous souhaitez lancer, et des éventuels noms de fichiers que vous allez passer en arguments. Par ailleurs, les arguments sont contenus dans un tableau...
function process
(
execpath,
args) {
//Creation d'un objet nsILocalFile pour l'application
var file =
Components.
classes[
"@mozilla.org/file/local;1"
]
.createInstance
(
Components.
interfaces.
nsILocalFile);
file.initWithPath
(
execpath);
//Creation du processus
var process =
Components.
classes[
"@mozilla.org/process/util;1"
]
.createInstance
(
Components.
interfaces.
nsIProcess);
process.init
(
file);
//Execution du processus
//Si le premier parametre est true, le script sera bloqué jusqu'a la fin du processus
//Les seconds et troisiemes parametres sont les arguments transmis a l'application
//(Le troisieme etant le nombre d'arguments).
process.run
(
false,
args,
args.
length);
}
Si vous souhaitez débugger plus facilement, il est possible de loguer des informations via la console d'erreurs.