IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Webbroser et chargement complet de la page


Sujet :

Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut Webbroser et chargement complet de la page
    Bonjour

    J utilise ce code qui fonctionne parfaitement pour attendre le chargement complet d une page web (frames, js etc) dans un TWebbrowser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     WebBrowser1.Navigate(URL);
      repeat
        Application.ProcessMessages;
        Sleep(0);
      until WebBrowser1.ReadyState = READYSTATE_COMPLETE;
    J aimerai pouvoir attendre la fin du chargement d'une page comme je le fais MAIS pour un lien cliqué dans la page mais je n ai aucune idée de comment procéder.
    Votre aide serait la bienvenue.
    D avance merci

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ne serait-il pas plus judicieux de passer par l'évènement OnDocumentComplete ? (je n'ai pas vérifié mais le nom m'a l'air sympa)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Voir les OnDocumentComplete dans les Event

    j'ai longtemps utilisé une boucle active et une fonction similaire à la tienne WaitWebAssigned !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ne serait-il pas plus judicieux de passer par l'évènement OnDocumentComplete ? (je n'ai pas vérifié mais le nom m'a l'air sympa)
    Le pb est le suivant (http://docwiki.embarcadero.com/Libra...cumentComplete)
    Ecrivez un gestionnaire d' événements OnDocumentComplete pour effectuer une action spécifique lorsqu'un cadre ou un document est entièrement chargé dans le navigateur Web. Pour un document sans cadres, cet événement se produit une fois lorsque le document a fini de se charger. Sur un document contenant plusieurs cadres, cet événement se produit une fois pour chaque cadre. Une fois le chargement du document à images multiples terminé, le navigateur Web déclenche l'événement une dernière fois.
    Donc, à moins de connaitre le nombre de frames dans la page ou la durée de chargement d une frame, on ne saura pas quel est l évènement final.

  5. #5
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Voir les OnDocumentComplete dans les Event

    j'ai longtemps utilisé une boucle active et une fonction similaire à la tienne WaitWebAssigned !
    Merci
    J'ai regardé le code mais visiblement il est appelé et on lui passe un TimeOut ce qui revient à connaitre par avance la durée de chargement non ? Désolé là je n ai pas tout compris.

  6. #6
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut
    En fait j ai trouvé la solution mais ai aucune idée de comment l'appliquer :

    In the loading process, the highest level frame, which is not necessarily the top-level frame, fires the final DocumentComplete event. At this time, the pDisp parameter is the same as the IDispatch interface pointer of the highest level frame.
    Si l un d entre vous avait une idée

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par MoiStéphane Voir le message
    Le pb est le suivant (http://docwiki.embarcadero.com/Libra...cumentComplete)


    Donc, à moins de connaitre le nombre de frames dans la page ou la durée de chargement d une frame, on ne saura pas quel est l évènement final.
    il est aussi indiqué "Se produit quand le document destination atteint l'état ReadyState_Complete." donc je ne vois pas la différence avec ton code
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par MoiStéphane Voir le message
    Merci
    J'ai regardé le code mais visiblement il est appelé et on lui passe un TimeOut ce qui revient à connaitre par avance la durée de chargement non ? Désolé là je n ai pas tout compris.
    En fait, je le couplais au OnDocumentComplete car j'avais constaté qu'accéder au Body trop vide dans le gestionnaire d'event, ça pouvait planter.
    Le TimeOut c'est juste éviter d'attendre sans fin, mais si tu atteints le OnDocumentComplete, attendre plus d'une seconde ce n'est pas normal du tout
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut
    Merci de t intéresser à mon problème.
    Je me suis peut etre mal expliqué.

    Le code suivant affiche 5 fois le message quand je fais un simple WebBrowser1.Navigate('https://www.developpez.com/'); alors que le code que je présente plus haut n'affiche le dialog qu une seule fois en toute fin de chargement. Ce que j aimerais c est pouvoir attendre le chargement complet de la page quand je clique sur un lien dans la page comme mon précèdent code le fait quand j appelle une page par Navigate et n afficher qu une fois le message.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm2.WebBrowser1DocumentComplete(ASender: TObject;
      const pDisp: IDispatch; const URL: OleVariant);
    begin
        if WebBrowser1.ReadyState = READYSTATE_COMPLETE then
        showmessage('Complete document was loaded')
    end;

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Faudrait vérifier URL car une page peut déclencher plusieurs redirection ou plusieurs sous-pages
    C'est bien pour cela que je parlais de vérifier l'état du Body car il peut être encore modifier même après le OnDocumentComplete (même si je crois que c'est le JS qui a cet effet)

    je précise que c'est à l'époque de IE6 en D7 en 2004 que j'ai du vérifier que le Body étant disponible sur le OnDocumentComplete pour parser le HTML
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Si je reconstitue un code simplifié de ce vieux programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    procedure TFrmShowURL.WebBrowserxxxDocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
    var
      AntiBoucle: Integer;
    begin
       try
          AntiBoucle := 0;
          while VarIsEmpty(TWebBrowser(Sender).OleObject.Document) and (AntiBoucle < 10000) do begin
             Inc(AntiBoucle);
             Application.ProcessMessages();
          end;
          Antiboucle := 0;
          while VarIsEmpty(TWebBrowser(Sender).OleObject.Document.Body) and (AntiBoucle < 10000) do begin
             Inc(AntiBoucle);
             Application.ProcessMessages();
          end;
     
          // --- accueil.php -----------------------------------------------------
          if (Pos('accueil.php', URL) > 0) or (Pos('verification.php', URL) > 0) then begin
             ScanAccueil(Sender); // ça lit TWebBrowser(Sender).OleObject.Document.Body.InnerHTML
          end
          else
          // --- menu.php --------------------------------------------------------
          if Pos('menu.php', URL) > 0 then begin
             ScanMenu(Sender); // ça lit TWebBrowser(Sender).OleObject.Document.Body.InnerHTML
          end
          else
          // --- marche.php ------------------------------------------------------
          if Pos('marche.php', URL) > 0 then begin
             ScanMarket(Sender); // ça lit TWebBrowser(Sender).OleObject.Document.Body.InnerHTML
          end
          else
            ... // un tas d'autre pages avec chacune un parsage différent
     
     
       except
          FichierLog('Except', 'Complete - ' + URL, Exception(ExceptObject()).Message);
       end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    alors si je fais ce test avec Edge

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      WebBrowser1.Navigate('https://www.developpez.com/');
      while not (WebBrowser1.ReadyState = READYSTATE_COMPLETE do
      begin
        Sleep(0);
        Application.ProcessMessages;
      end;
      AllocConsole;
      WriteLn(FormatDateTime('hh:nn:ss', Now), ' Done');
    end;
     
    procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
      const pDisp: IDispatch; const URL: OleVariant);
    begin
      AllocConsole;
      WriteLn(FormatDateTime('hh:nn:ss', Now), ' DocumentComplete');
      if WebBrowser1.ReadyState = READYSTATE_COMPLETE then
        WriteLn(FormatDateTime('hh:nn:ss', Now), ' ReadyState Complete');
    end;
    j'ai ceci

    11:59:25 DocumentComplete
    11:59:25 ReadyState Complete
    11:59:25 DocumentComplete
    11:59:25 ReadyState Complete
    11:59:25 Done
    
    en fait je pense que c'est tellement rapide que ça ne change rien...il faudrait tester avec une frame très lente à charger pour voir s'il y a une différence, est-ce qu'on sort de la boucle ou pas

    hum...avec cdiscount.com j'ai ça

    12:02:05 DocumentComplete
    12:02:12 DocumentComplete
    12:02:13 Done
    
    oui c'est étrange...

    bon j'ai cherché plus loin, tu peux utiliser DownloadComplete

    j'ai ajouté ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      TWebBrowser = class(SHDocVw.TWebBrowser)
        procedure InvokeEvent(DispID: TDispID; var Params: TDispParams); override;
      end;
    ...
    procedure TWebBrowser.InvokeEvent(DispID: TDispID; var Params: TDispParams);
    begin
      AllocConsole;
      WriteLn('DispID = ', DispID);
      inherited;
    end;
    pour voir les évènements déclenchés et j'ai trouvé les descriptions ici
    https://github.com/tpn/winsdk-10/blo.../um/ExDispid.h

    ils ne sont pas tous gérés par le composant Delphi, mais pour autant que je puisse en juger DISPID_DOWNLOADCOMPLETE est le plus indiqué
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  13. #13
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut
    Merci d avoir pris le temps de me répondre.

    J'ai testé en essayant de trouver qq chose entre les différents évènements mais je ne suis parvenu à rien de probant sinon que j ai appris le rôle des différents évènements du TWebbrowser et cela m 'a donné une idée d'approche différente.

    C' est peut être tirée par les cheveux et pas techniquement réalisable (en tous les cas elle ne l est pas à mon niveau).

    Ne serait il pas possible " d'intercepter " le message READYSTATE_COMPLETE, de tester pendant 1 seconde si Webbroser.busy = false et si au bout de la seconde c est toujours le cas alors on laisse le message se propager sinon on "detruit" le message ? Ainsi si durant la seconde de test le navigateur télécharge alors le message n est pas propagé et tout se poursuit, si aucune action n est exécuté coté webbroser durant cette seconde alors c est que la page est réellement et entièrement chargée.

    Ici j envisage une seconde pour tester mais j imagine que les actions sont faites les unes immédiatement après les autres donc ce devrait être des millisecondes

    Qu en pensez vous ?

    Merci

  14. #14
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par MoiStéphane Voir le message
    Merci d avoir pris le temps de me répondre.

    J'ai testé en essayant de trouver qq chose entre les différents évènements mais je ne suis parvenu à rien de probant sinon que j ai appris le rôle des différents évènements du TWebbrowser et cela m 'a donné une idée d'approche différente.

    C' est peut être tirée par les cheveux et pas techniquement réalisable (en tous les cas elle ne l est pas à mon niveau).

    Ne serait il pas possible " d'intercepter " le message READYSTATE_COMPLETE, de tester pendant 1 seconde si Webbroser.busy = false et si au bout de la seconde c est toujours le cas alors on laisse le message se propager sinon on "detruit" le message ? Ainsi si durant la seconde de test le navigateur télécharge alors le message n est pas propagé et tout se poursuit, si aucune action n est exécuté coté webbroser durant cette seconde alors c est que la page est réellement et entièrement chargée.

    Ici j envisage une seconde pour tester mais j imagine que les actions sont faites les unes immédiatement après les autres donc ce devrait être des millisecondes

    Qu en pensez vous ?

    Merci
    je ne sais pas si c'est judicieux, mais pour ce genre de chose, par exemple lancer une recherche suite à une saisie dans un TEdit, ou actualisation d'un Dataset suite à un évènement quelconque...j'utilise un Timer, sur l'évènement je le désactive (pour réinitialiser le timer) et je le réactive, je règle sa durée à 100ms par exemple, et du coup, si l'évènement se produit deux fois en 100ms, le timer ne se déclenche qu'une seule fois, 100ms après le dernier évènement.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  15. #15
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut
    Merci pour cette idée à ma portée techniquement.
    Quand je ne sais pas j ai tendance à réinventer la roue alors que là c est simple.

  16. #16
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut
    Pour info, le principe avec le timer fonctionne parfaitement si ce dernier est réglé sur 500ms car certaines pages, avec 100ms posent problème. merci encore pour cette solution simple mais parfaitement fonctionnelle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Redirection après chargement complet de la page
    Par humitake dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/01/2012, 17h13
  2. Réponses: 1
    Dernier message: 25/10/2011, 11h44
  3. image d'attente avant chargement complet d'une page
    Par kamclasse dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 31/01/2009, 14h00
  4. [XUL/JS] Tester le chargement complet d'une page avec frames
    Par Mr Pink Eyes dans le forum Autres langages pour le Web
    Réponses: 6
    Dernier message: 06/05/2008, 12h25
  5. Réponses: 2
    Dernier message: 05/02/2007, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo