TGeckoBrowser XPCOM , perte de lien css, et img
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:
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:
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:
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