If found that I should use my own TCefResourceHandler.
So I tried this:
Code: Select all
{$I cef.inc}
interface
uses
System.Classes, WinApi.Windows, System.SysUtils,
uCEFInterfaces, uCEFTypes, uCEFResourceHandler,uCEFUrlrequestClient;
type
TA21CEFResourceHandler = class(TCefResourceHandlerOwn)
private
FOffset: NativeUInt;
FStream: TMemoryStream;
FCallback: ICefCallback;
FResponse: ICefResponse;
protected
function ProcessRequest(const Request: ICefRequest; const Callback: ICefCallback): Boolean; override;
procedure GetResponseHeaders(const Response: ICefResponse; out ResponseLength: Int64; out RedirectUrl: ustring); override;
function ReadResponse(const DataOut: Pointer; BytesToRead: Integer; var BytesRead: Integer; const Callback: ICefCallback): Boolean; override;
public
constructor Create(const Browser: ICefBrowser; const Frame: ICefFrame; const SchemeName: ustring; const Request: ICefRequest); reintroduce;
destructor Destroy; override;
procedure WriteResponse(const Request: ICefUrlRequest; Data: Pointer; Size: NativeUInt); virtual;
procedure CompleteRequest(const Request: ICefUrlRequest); virtual;
end;
TA21HttpRequestClient = class(TCefUrlrequestClientOwn)
private
FHandler: TA21CEFResourceHandler;
protected
procedure OnDownloadData(const Request: ICefUrlRequest; Data: Pointer; DataLength: NativeUInt); override;
procedure OnRequestComplete(const Request: ICefUrlRequest); override;
public
constructor Create(Handler: TA21CEFResourceHandler); reintroduce;
end;
implementation
Uses uCefStringMultimap, uCEFUrlRequest;
constructor TA21CEFResourceHandler.Create(const Browser: ICefBrowser; const Frame: ICefFrame; const SchemeName: ustring; const Request: ICefRequest);
begin
inherited Create(Browser, Frame, SchemeName, Request);
FStream := TMemoryStream.Create;
end;
destructor TA21CEFResourceHandler.Destroy;
begin
FStream.Free;
inherited;
end;
function TA21CEFResourceHandler.ProcessRequest(const Request: ICefRequest; const Callback: ICefCallback): Boolean;
begin
Result := True;
// reset the offset value
FOffset := 0;
// store the callback reference
FCallback := Callback;
// create the URL request that will perform actual data exchange (you can replace
// it with any other; e.g. with MSXML, or an Indy client)
TCefUrlRequestRef.New(Request, TA21HttpRequestClient.Create(Self), Nil);
end;
procedure TA21CEFResourceHandler.GetResponseHeaders(const Response: ICefResponse; out ResponseLength: Int64; out RedirectUrl: ustring);
var
HeaderMap: ICefStringMultimap;
begin
// return the size of the data we have in the response stream
ResponseLength := FStream.Size;
// fill the header fields from the response returned by the URL request
Response.Status := FResponse.Status;
Response.StatusText := FResponse.StatusText;
Response.MimeType := FResponse.MimeType;
// copy the header map from the response returned by the URL request
HeaderMap := TCefStringMultimapOwn.Create;
FResponse.GetHeaderMap(HeaderMap);
if HeaderMap.Size <> 0 then
FResponse.SetHeaderMap(HeaderMap);
end;
function TA21CEFResourceHandler.ReadResponse(const DataOut: Pointer; BytesToRead: Integer; var BytesRead: Integer; const Callback: ICefCallback): Boolean;
begin
// since this method can be called multiple times (reading in chunks), check if we
// have still something to transfer
if FOffset < FStream.Size then
begin
Result := True;
BytesRead := BytesToRead;
// copy the data from the response stream to the browser buffer
Move(Pointer(NativeUInt(FStream.Memory) + FOffset)^, DataOut^, BytesRead);
// increment the offset by the amount of data we just copied
Inc(FOffset, BytesRead);
end
else
Result := False;
end;
procedure TA21CEFResourceHandler.WriteResponse(const Request: ICefUrlRequest; Data: Pointer; Size: NativeUInt);
begin
// write the just downloaded data to the intermediate response stream
FStream.Write(Data^, Size);
end;
procedure TA21CEFResourceHandler.CompleteRequest(const Request: ICefUrlRequest);
begin
FStream.Position := 0;
// store the response reference for the GetResponseHeaders method
FResponse := Request.GetResponse;
// this signals the handler that the request has completed and that it can process
// the response headers and pass the content to the browser
if Assigned(FCallback) then
FCallback.Cont;
end;
{ TA21HttpRequestClient }
constructor TA21HttpRequestClient.Create(Handler: TA21CEFResourceHandler);
begin
inherited Create;
FHandler := Handler;
end;
procedure TA21HttpRequestClient.OnDownloadData(const Request: ICefUrlRequest; Data: Pointer; DataLength: NativeUInt);
begin
inherited;
FHandler.WriteResponse(Request, Data, DataLength);
end;
procedure TA21HttpRequestClient.OnRequestComplete(const Request: ICefUrlRequest);
begin
inherited;
FHandler.CompleteRequest(Request);
end;
And I'm using it like that way:
Code: Select all
procedure TMainForm.CHROMEGetResourceHandler(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; var aResourceHandler: ICefResourceHandler);
begin
aResourceHandler:=TA21CEFResourceHandler.Create(browser, frame, 'TA21CEFResourceHandler', request);
end;
I this code I haven't changed any header yet. Just try to use this handler.
But when I did that I have a strange result when I open any website:
screen.png
Have I missed something in my handler ?
You do not have the required permissions to view the files attached to this post.