Bonjour à tous, j'espère avoir posté ma question sur le bon forum. je travaille sur une application écrite en delphi avec un composant "WebBrowser" basé sur IE, dans lequel nous injectons du code HTML généré à partir de XML et transformation XSL, avec des liens vers une feuille de style .css, et des images... Suite à de nombreux soucis (avec IE), j'ai découvert le moteur Gecko et une implémentation faite en Delphi basée sur XPCom. ça commence à fonctionner, mais la seule chose qui m'embête c'est que j'ai perdu la mise en page de ma feuille de style, et que mes images ne sont pas affichées... ça ressemble à un problème de lien ?

Voici comment j'alimente le composant TGeckoBrowser avec en paramètre le code source du html :

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
procedure TGeckoBrowser.LoadHTML(htmlcode: String);
var
  wbchrome: nsIWebBrowserChrome;
  wb: nsIWebBrowser;
  domwindow: nsIDOMWindow;
  domdoc: nsIDOMDocument;
  domhtmldoc: nsIDOMHTMLDocument;
  nsstr: IInterfacedString;
begin
  wbchrome := Self as nsIWebBrowserChrome;
  wbchrome.GetWebBrowser(wb);
  wb.GetContentDOMWindow(domwindow);
  domwindow.GetDocument(domdoc);
  domhtmldoc:= domdoc as nsIDOMHTMLDocument;

  nsstr:= NewString;
  nsstr.Assign(htmlcode);
  domhtmldoc.Write(nsstr.AString);
end;
voici à quoi ressemble le début de mon html avec le lien vers le css, et vers mes images :
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
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-16">
<title>Marque</title>
<base href="file://E:/Projets/Delphi/PaletteInfo.Essai/htdocs/">
<link rel="stylesheet" href="styles.css" type="text/css">
</head>
<body>
<table border="0" width="100%">
<tr class="marque">
<th colspan="2" class="marque">PL</th>
</tr>
<tr class="marque">
<td width="20%" class="marque">Immatric :</td>
<td class="marqueValue">1665 ZK 14</td>
</tr>
<tr class="marque">
<td width="20%" class="marque">Numero :</td>
<td class="marqueValue">0656</td>
</tr>
<tr class="marque">
<td width="20%" class="marque">Telephone !! :</td>
<td class="marqueValue">+33679609649</td>
</tr>
<tr class="marque">
<td width="20%" class="marque">Etat :</td>
<td class="marqueValue" style="background-color: #E4E9FF;">
<img src="img/repos.png">-Repos</td>
</tr>

....
]
ce code fonctionnait sous IE... et le plus étrange, c'est que si je fais un TGeckoBrowser.LoadURI() avec en paramètre un fichier .html contenant le code html, cela fonctionne parfaitement. LoadURI ressemble à ceci :

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
40
41
42
43
44
45
46
procedure TGeckoBrowser.LoadURI(uri: WideString; loadFlags: Cardinal;
                                referer: String;
                                postData: String;
                                headers: String);
var
  webNavigation: nsIWebNavigation;
  refererURI: nsIURI;
  postPtr, headPtr: Pointer;
  postLen, headLen: Longword;
  postStream, headStream: nsIInputStream;
  dataStream:nsIStringInputStream;
  mimeStream:nsIMIMEInputStream;
begin
  if not Supports(FWebBrowser, nsIWebNavigation, webNavigation) then Exit;

  if Length(referer)>0 then
  begin
    NS_NewURI(refererURI,referer);
  end;

  postLen := Length(postData);
  if postLen>0 then
  begin
    NS_CreateInstance('@mozilla.org/io/string-input stream;1',nsIStringInputStream,dataStream);
    dataStream.SetData(PChar(postData),postLen);
    NS_CreateInstance('@mozilla.org/network/mime-input-stream;1',nsIMIMEInputStream,mimeStream );
    mimeStream.AddHeader(PChar('Content-Type'),PChar('application/x-www-form-urlencoded'));
    mimeStream.SetAddContentLength(true);
    mimeStream.SetData(dataStream);
    mimeStream.QueryInterface(nsIInputStream,postStream);
  end;

  headLen := Length(headers);
  if headLen>0 then
  begin
    headPtr := nsMemory.Alloc(headLen);
    if Assigned(headPtr) then
    begin
      NS_MEMCPY(headPtr, PChar(headers), headLen);
      NS_NewByteArrayInputStream(headStream, headPtr, headLen);
    end;
  end;

  webNavigation.LoadURI(PWideChar(uri), loadFlags, refererURI, postStream, headStream);
end;
Ce qui m'embête dans ce dernier cas, c'est d'écrire un fichier html sur le disque à chaque fois, j'aurais préféré alimenté dynamiquement comme dans la première méthode LoadHTML...

quelqu'un pourrait il m'aider ?

je suis very newbee sur XPCom...

Merci pour toute aide. Christophe