Problème avec TWebBrowser sous delphi 7
Cet article s’adresse aux programmeurs sous delphi.
J’essaie d’implémenter dans une des mes applications sous delphi 7 un composant TWebBrowser qui est chargé d’afficher des pages web dans l’application, principalement des pages du site de Deezer pouvant jouer de la musique. Je précise que je suis sur Windows 7 – 64 bits, et que mon delphi 7 est en 32 bits. J’ai donc installé les composants ActiveX nécessaires selon la procédure standard: dans le menu de delphi, sous l’onglet Components on clique sur la commande Import ActiveX Control… et on installe Microsoft Internet Controls (Version 1.1) et éventuellement pour certains usages, mais ce n’est pas indispensable ici, Microsoft HTML Object Library (Version 4.0). On obtient alors dans le menu de delphi, deux (ou éventuellement trois) nouveaux composants, dont le composant TWebBrowser qui permet d’afficher des pages web, sous la réserve importante que le navigateur Internet Explorer de Microsoft soit installé sur le système. En effet TWebBrowser utilise le moteur de IE pour afficher des pages web plus ou moins complexes. Pour ma part j’ai la dernière version de IE11 qui est installée.
L’application de test que je propose est très simple. Dans un nouveau projet, je crée une Form, j’y place un composant TWebBrowser et un composant TButton et ensuite, quand on clique sur le bouton (intitulé ‘Load‘), il charge une page web donnée par son url à l’aide de la méthode navigate fournie par TWebBrowser. Le code complet de l’unit est le suivant:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, SHDocVw_TLB;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var url:widestring;
begin
url:='https://www.deezer.com/en/track/125387076';
WebBrowser1.Navigate(url);
end;
end.
Quand je lance l’application, tout semble bien aller. Dès que je clique sur le bouton Load, il charge la page de Deezer demandée, permettant d’écouter un chant polonais de Chopin. On peut l’écouter en cliquant sur le bouton Play de Deezer. Mais ensuite, il y a des comportements inattendus.
1ère surprise: Si on clique une deuxième fois sur Load, alors la même page se recharge une deuxième fois, mais le bouton Play ne fait plus rien.
2ème surprise: Si on continue à cliquer plusieurs fois sur le bouton Load, alors la page se recharge encore, mais seulement six fois au total. A partir de la septième fois, plus rien ne s’affiche et le TWebBrowser reste blanc.
J’ai trouvé une solution pour contourner la 1ère surprise: elle est liée aux fichiers que le Flash Player d’Adobe laisse dans le dossier Temporary Internet Files. On peut retrouver un bouton Play actif, si avant de charger l’url, on efface tous les fichiers ayant un nom de la forme coreplayer* .swf qui peuvent se trouver directement ou dans différents sous-dossiers de ce répertoire caché.
Par contre, malgré des jours de recherche et de tests, je n’ai pas trouvé pourquoi les pages de Deezer ne se chargent que 6 fois. Voilà quelques constatations:
- seules les pages pointant sur un morceau de Deezer , avec une url de type
'https://www.deezer.com/en/track/'+ID,
où ID représente le numéro de la piste, ont ce comportement. Les autres sites web, même s’ils comportent des vidéos ou de la musique, par exemple Youtube, s’affichent un nombre indéfini de fois. - La limitation à 6 affichages n’est présente que si la page web s’affiche dans la Form. Si on demande à WebBrowser1 d’afficher l’url dans une nouvelle fenêtre, en rajoutant une variable Olevariant Flags:=1 à la procédure navigate qui devient
WebBrowser1.Navigate(url,Flags);
alors les pages de Deezer s’affichent un nombre illimité de fois, mais bien sûr chacune dans une nouvelle fenêtre externe à l’application, ce qui n’est pas mon objectif. Cela prouve au moins que ce n’est pas Deezer qui impose cette limitation, car pourquoi ne l’aurait-il fait que sur les affichages dans une application delphi ? - Si on lance simultanément plusieurs fois l’application delphi, alors on peut charger la page de Deezer 6 fois dans chacune.
- Quand on quitte une telle application et qu’on la relance, le compteur des 6 fois repart à zéro.
- En revanche, si on met deux composants TWebBrowser sur la form, et qu’à chaque click sur le bouton on affiche une page de Deezer sur chacun d’eux, alors au bout de 3 clicks l’affichage devient blanc. C’est la preuve que la limite de 6 est globale pour tous les composants TWebBrowser dans une application delphi.
- De même, si au sein de l’application, on détruit le composant TWebBrowser et on le recrée pendant l’exécution, alors le compteur des 6 fois ne repart pas à zéro. La limitation reste à 6 affichages au total, même si c’est avec des composants TWebBrowser qui ont été nouvellement créés.
- Pour vous économiser la peine de me donner des réponses trop générales, sachez que j’ai essayé toutes les versions de navigate ou navigate2, avec ou sans oleobject, que j’ai réinstallé la dernière version de ie11, que j’ai effacé le cache ou l’historique de ie11 entre deux clicks sur le bouton, que j’ai essayé de placer le composant TWebBrowser sur d’autres composants comme un panel ou une frame, que j’ai modifié les inscriptions dans la base de registres sous FEATURE_BROWSER_EMULATION, que j’ai essayé de compiler avec ou sans informations de débogage, avec ou sans optimisation, que j’ai lancé mon application de test sur d’autres systèmes, notamment Windows 10 . Rien n’y fait. Chaque fois que je veux afficher un morceau de Deezer au sein de mon application, cette limite à six affichages s’applique.
Pour ceux qui sont intéressés par ce problème, vous pouvez télécharger ci-dessous:
- le fichier exécutable webbrowser.exe que tout le monde peut télécharger pour voir si cette limitation à 6 affichages s’applique aussi sur son système.
- une zip contenant le code source du projet webbrowser que les programmeurs peuvent ouvrir dans delphi pour faire des tests. Mais pour cela il faut qu’ils aient installé le composant TWebBrowser dans leur delphi. Si cela n’est pas fait, j’ai indiqué ci-dessus comment faire.
Si quelqu’un trouve une solution, ou même seulement une explication, alors son nom figurera dans le Hall of Fame de ce blog 😉