Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Un cache pour une extension

Envoyé par : LAurent

Date : 19/04/2005 20:07

Bonjour à tous encore une fois.

Voici mon problème courant : garder le contenu d'une variable en local sur le pc client qui supporte mon extension.

J'explique : j'ai une fonction qui va lire régulièrement le contenu d'un fichier RDF distant par un xmlhttprequest. Si je lance plusieurs firefox, j'ai donc plusieurs requetes pour le même résultat. Je souhaiterais un fonctionnement du type "si le fichier contenant la variable a moins de 5 minutes : l'utiliser, sinon refaire la requête...".

Puis-je le faire en javascript ? Dois-je alors passer par un cookie ? (mes tests ont l'air de me prouver que non...) Dois-je passer par la fonction "persist" et si oui comment ?

Je suis en train de lire http://xulfr.org/xulplanet/xultu/rdfscript.html suis-je sur la bonne voie ? La source de données qui est mentionnée est-elle un fichier local sur lequel on peut agir ?

# Re: Un cache pour une extension

Envoyé par : laurentj

Date : 20/04/2005 12:12

j'ai une fonction qui va lire régulièrement le contenu d'un fichier RDF distant par un xmlhttprequest

gni ? pourquoi utiliser xmlhttprequest ?

Ne pourrais tu pas tout simplement faire un template xul et indiquer ce fichier RDF comme source de donnée ?

Sinon, normalement, le contenu distant est mis dans le cache (sauf si le cache est désactivé ou à 0 dans la config de firefox. Tu ne devrais pas avoir de problème

Sauf si bien sûr, coté serveur, le contenu du RDF n'est pas un fichier statique (donc une page php par exemple) et que tu n'indiques pas au client que le contenu n'a pas changé via le protocole HTTP.

pour plus d'explications : http://blog.dreams4net.com/CachezMoiCa

En clair : ce n'est pas coté client qu'il faut gérer ça, mais coté serveur en utilisant les mécanismes du protocole HTTP.

# Re: Un cache pour une extension

Envoyé par : LAurent

Date : 20/04/2005 20:47

j'ai une fonction qui va lire régulièrement le contenu d'un fichier RDF distant par un xmlhttprequest

gni ? pourquoi utiliser xmlhttprequest ?

Non, je sais pas pourquoi j'ai marqué rdf... :-p En fait, je vais chercher toutes les trente secondes le contenu d'un fichier texte qui change régulièrement...

Tu me dis que ce contenu est conservé en local, mais comment puis-je y avoir accès ?

# Re: Un cache pour une extension

Envoyé par : laurentj

Date : 21/04/2005 13:35

Je le repète : l'accés est transparent normalement. Quand tu fais une demande xmlhttprequest, si le fichier demandé est dans le cache est qu'il n'y a pas de mise à jour sur le serveur (et ça, il le sait via les entetes http qu'il recoit par le serveur), il prend le cache.

tu n'as pas à gérer ça. C'est à toi par contre, coté serveur, de renvoyer les bons entetes HTTP permettant d'indiquer que le fichier demandé a été modifié ou non (dans le cas où il s'agit d'un fichier "dynamique", en php ou autre).

# Re: Un cache pour une extension

Envoyé par : LAurent

Date : 23/04/2005 10:39

Pour le renvoi des entêtes http, je suis bon de ce coté là... Même si ce n'est pas à proprement un fichier dynamique, puisque c'est vraiment un fichier texte généré par un fichier php.

Mais ca ne me semble pas très propre quand même, prenons un cas sadique d'un type qui va ouvrir dix fois firefox, la requete va quand même se faire dix fois... Je préfererais une fonction qui va mettre un jour une variable locale, à déterminer, c'est le but de mon post...

Mon appli va sans doute être beaucoup diffusé, auprès d'un public pas forcément folichon en info... Je préfère penser à ca maintenant...

Prenons le problème d'un autre angle... J'ai un menu peuplé par un rdf distant, puis-je aussi avoir un fonctionnement équivalent à un xmlhttprequest appelé à intervalle régulier et sauvé en local ? Aujourd'hui, il ne se met à jour que quand je ferme et réouvre firefox...

Merci pour tes réponses !

# Re: Un cache pour une extension

Envoyé par : LAurent

Date : 24/04/2005 14:21

Bon j'avance toujours...

J'utilise ce bout de code

function writeToFile() { //test d'écriture en local d'un contenu dans un fichier
try {
  var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);

  // local file path for windows
  file.initWithPath("c:\\tmp\\foo.dat");

  if (!file.exists())
    file.create(file.NORMAL_FILE_TYPE, 0644);

  var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  var uri = ioService.newFileURI(file);
  var channel = ioService.newChannelFromURI(uri);
  var outputStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);

  outputStream.init(file, 0x20|0x02, 00004, null);
  var buffer = "This is a test\n";

  outputStream.write(buffer, buffer.length);
  outputStream.flush();
  outputStream.close();
} catch (e) { dump(e); }
}

tiré d'un doc sur jslib... IL permet bien d'écrire une chaine de caractère dans un fichier en local.

Mon problème se pose maintenant sur l'emplacement de mon fichier : Si je mets un

file.initWithPath("c:\\tmp\\foo.dat");

j'écris bien sur le disque à l'endroit spécifié mais ca n'est pas très judicieux... Je prefererais écrire dans le répertoire de l'extension ou dans les fichiers de cache de la navigation J'ai essayé diverses choses :

chrome://rafalebarre/foo.dat
chrome://rafalebarre/content/foo.dat
.\foo.dat
.\\foo.dat

mais rien d'autre ne marche que le chemin absolu... Quelqu'un aurait-il d'autres idées ?

# Re: Un cache pour une extension

Envoyé par : laurentj

Date : 25/04/2005 14:10

Pour le renvoi des entêtes http, je suis bon de ce coté là... Même si ce n'est pas à proprement un fichier dynamique, puisque c'est vraiment un fichier texte généré par un fichier php.

C'est bien ce que je dis. Si c'est généré par du PHP, alors la date de dernière modification envoyée par défaut par le serveur web est celle de maintenant. Du coup, mozilla voyant que la date de modification a encore changé par rapport à la dernière fois que le fichier a été demandé, il va recharger le fichier.

Si par contre, toi, dans ton fichier php, tu fais un header('..') correct qui indique que la date de modification est une date X, si cette date X est identique à chaque demande de xmlhttprequest, mozilla va donc taper dans son cache, il ne va pas retelecharger le contenu générer par ton fichier PHP (que ce toi du texte simple, html, xml, rdf ou autre...) À toi aprés de faire en sorte que cette date X soit la date de dernière modification des données. Imaginons par exemple que ton fichier PHP génère une liste des dernières news, tu mettras dans le header la date de la dernière news. Ainsi Mozilla ne rechargera la page à la prochaine demande que lorsqu'il y aura une nouvelle news.

Mais ca ne me semble pas très propre quand même, prenons un cas sadique d'un type qui va ouvrir dix fois firefox, la requete va quand même se faire dix fois...

La requete se fait dix fois, mais pas le téléchargement du contenu.

C'est au contraire une manière trés propre de le faire car tu utilises les mécanismes de HTTP. ils sont fait pour ça.

C'est un moyen sûr d'avoir toujours un contenu à jour, sans s'emmerder avec ces histoires de temps de téléchargement, de bande passante etc..

Je préfererais une fonction qui va mettre un jour une variable locale, à déterminer, c'est le but de mon post...

Pour moi non, c'est au contraire ne pas utiliser les mécanismes déjà mis en place, et totalement transparent pour toi.

Mon appli va sans doute être beaucoup diffusé, auprès d'un public pas forcément folichon en info... Je préfère penser à ca maintenant...

et alors ? tu fourni aussi le fichier php non ? je ne vois pas en quoi ça génèrerais ce public là. il va pas aller tripatouiller ton code...

Prenons le problème d'un autre angle... J'ai un menu peuplé par un rdf distant, puis-je aussi avoir un fonctionnement équivalent à un xmlhttprequest appelé à intervalle régulier et sauvé en local ?

C'est déjà le cas, c'est totalement transparent normalement.

Aujourd'hui, il ne se met à jour que quand je ferme et réouvre firefox...

C'est un bug du cache des rdf ça.. Si tu veux forcer la mise à jour d'un rdf, il suffit de faire un setAttribute("datasources","") suivi d'un setAttribute("datasources","ton.rdf")

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.