You've already forked CEF4Delphi
mirror of
https://github.com/salvadordf/CEF4Delphi.git
synced 2025-06-22 22:17:48 +02:00
Update to CEF 3.3578.1863.gbf8cff2
- Removed obsolete "Result" parameter in all OSR demos. - Added more code comments to ResponseFilterBrowser. - Now ResponseFilterBrowser modifies the HTTP request to receive uncompressed resources. - Updated compiler properties in Delphinus.Install.json
This commit is contained in:
@ -50,7 +50,8 @@ uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics,
|
||||
Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, ComCtrls, pngimage,
|
||||
{$ENDIF}
|
||||
uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, uCEFResponseFilter;
|
||||
uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, uCEFResponseFilter,
|
||||
uCEFWinControl;
|
||||
|
||||
const
|
||||
STREAM_COPY_COMPLETE = WM_APP + $B00;
|
||||
@ -79,6 +80,8 @@ type
|
||||
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
|
||||
procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser);
|
||||
procedure Chromium1LoadStart(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; transitionType: Cardinal);
|
||||
procedure Chromium1BeforeResourceLoad(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const callback: ICefRequestCallback; out Result: TCefReturnValue);
|
||||
procedure Chromium1ResourceResponse(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; out Result: Boolean);
|
||||
|
||||
procedure FormShow(Sender: TObject);
|
||||
procedure FormCreate(Sender: TObject);
|
||||
@ -87,6 +90,7 @@ type
|
||||
|
||||
procedure GoBtnClick(Sender: TObject);
|
||||
procedure Timer1Timer(Sender: TObject);
|
||||
|
||||
protected
|
||||
FFilter : ICefResponseFilter; // CEF Filter interface that receives the resource contents
|
||||
FStream : TMemoryStream; // TMemoryStream to hold the resource contents
|
||||
@ -116,6 +120,7 @@ type
|
||||
procedure ReplaceLogo(data_in: Pointer; data_in_size: NativeUInt; var data_in_read: NativeUInt; data_out: Pointer; data_out_size : NativeUInt; var data_out_written: NativeUInt; var aResult : TCefResponseFilterStatus);
|
||||
procedure UpdateRscEncoding(const aMimeType, aContentType : string);
|
||||
function IsMyResource(const aRequest : ICefRequest) : boolean;
|
||||
procedure CheckResponseHeaders(const response : ICefResponse);
|
||||
{$IFDEF DELPHI15_UP}
|
||||
procedure GetResponseEncoding(const aContentType: string);
|
||||
{$ENDIF}
|
||||
@ -136,7 +141,7 @@ uses
|
||||
{$ELSE}
|
||||
Math,
|
||||
{$ENDIF}
|
||||
uCEFApplication, uCEFMiscFunctions;
|
||||
uCEFApplication, uCEFMiscFunctions, uCEFStringMultimap;
|
||||
|
||||
// This demo uses a TCustomResponseFilter to read the contents from a
|
||||
// JavaScript file in briskbard.com into a TMemoryStream. The stream
|
||||
@ -174,6 +179,14 @@ uses
|
||||
// This will trigger the TCustomResponseFilter.OnFilter event again and you
|
||||
// will be able to send another chunk.
|
||||
|
||||
// If the server sends compressed data or it doesn't include a "Content-Length"
|
||||
// HTTP response header then the filter *might* fail. In this case,
|
||||
// Filter_OnFilter will receive a NIL value in data_in before the recource
|
||||
// response is really complete.
|
||||
|
||||
// If this demo is too complicated or the filter fails, consider using the
|
||||
// URLRequest demo if possible.
|
||||
|
||||
procedure TResponseFilterBrowserFrm.Filter_OnFilter( Sender : TObject;
|
||||
data_in : Pointer;
|
||||
data_in_size : NativeUInt;
|
||||
@ -385,70 +398,90 @@ begin
|
||||
PostMessage(Handle, WM_CLOSE, 0, 0);
|
||||
end;
|
||||
|
||||
procedure TResponseFilterBrowserFrm.Chromium1BeforePopup(Sender: TObject;
|
||||
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
|
||||
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
|
||||
userGesture: Boolean; const popupFeatures: TCefPopupFeatures;
|
||||
var windowInfo: TCefWindowInfo; var client: ICefClient;
|
||||
var settings: TCefBrowserSettings; var noJavascriptAccess: Boolean;
|
||||
var Result: Boolean);
|
||||
procedure TResponseFilterBrowserFrm.Chromium1BeforePopup( Sender : TObject;
|
||||
const browser : ICefBrowser;
|
||||
const frame : ICefFrame;
|
||||
const targetUrl : ustring;
|
||||
const targetFrameName : ustring;
|
||||
targetDisposition : TCefWindowOpenDisposition;
|
||||
userGesture : Boolean;
|
||||
const popupFeatures : TCefPopupFeatures;
|
||||
var windowInfo : TCefWindowInfo;
|
||||
var client : ICefClient;
|
||||
var settings : TCefBrowserSettings;
|
||||
var noJavascriptAccess : Boolean;
|
||||
var Result : Boolean);
|
||||
begin
|
||||
// For simplicity, this demo blocks all popup windows and new tabs
|
||||
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
|
||||
end;
|
||||
|
||||
procedure TResponseFilterBrowserFrm.Chromium1BeforeResourceLoad( Sender : TObject;
|
||||
const browser : ICefBrowser;
|
||||
const frame : ICefFrame;
|
||||
const request : ICefRequest;
|
||||
const callback : ICefRequestCallback;
|
||||
out Result : TCefReturnValue);
|
||||
var
|
||||
TempOldMap, TempNewMap : ICefStringMultimap;
|
||||
i : NativeUInt;
|
||||
TempReplaced : boolean;
|
||||
begin
|
||||
Result := RV_CONTINUE;
|
||||
|
||||
try
|
||||
// We replace the Accept-Encoding HTTP header to request uncompressed resources.
|
||||
// If the server sends uncompressed resources it should be easier to handle the
|
||||
// end of the resource reception because we may know its length.
|
||||
|
||||
TempNewMap := TCefStringMultimapOwn.Create;
|
||||
TempOldMap := TCefStringMultimapOwn.Create;
|
||||
|
||||
request.GetHeaderMap(TempOldMap);
|
||||
|
||||
TempReplaced := False;
|
||||
i := 0;
|
||||
while (i < TempOldMap.Size) do
|
||||
begin
|
||||
if (CompareText(TempOldMap.Key[i], 'Accept-Encoding') = 0) then
|
||||
begin
|
||||
TempNewMap.Append('Accept-Encoding', 'identity');
|
||||
TempReplaced := True;
|
||||
end
|
||||
else
|
||||
TempNewMap.Append(TempOldMap.Key[i], TempOldMap.Value[i]);
|
||||
|
||||
inc(i);
|
||||
end;
|
||||
|
||||
if not(TempReplaced) then TempNewMap.Append('Accept-Encoding', 'identity');
|
||||
request.SetHeaderMap(TempNewMap);
|
||||
finally
|
||||
TempNewMap := nil;
|
||||
TempOldMap := nil;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TResponseFilterBrowserFrm.Chromium1Close(Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
|
||||
begin
|
||||
PostMessage(Handle, CEF_DESTROY, 0, 0);
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
procedure TResponseFilterBrowserFrm.Chromium1GetResourceResponseFilter(Sender : TObject;
|
||||
procedure TResponseFilterBrowserFrm.Chromium1GetResourceResponseFilter( Sender : TObject;
|
||||
const browser : ICefBrowser;
|
||||
const frame : ICefFrame;
|
||||
const request : ICefRequest;
|
||||
const response : ICefResponse;
|
||||
out Result : ICefResponseFilter);
|
||||
var
|
||||
TempContentLength, TempContentEncoding : string;
|
||||
TempLen : integer;
|
||||
begin
|
||||
if not(FRscCompleted) and (response <> nil) and IsMyResource(request) then
|
||||
begin
|
||||
try
|
||||
FStreamCS.Acquire;
|
||||
Result := FFilter;
|
||||
FFilterInit := True;
|
||||
|
||||
Result := FFilter;
|
||||
FFilterInit := True;
|
||||
TempContentEncoding := trim(lowercase(response.GetHeader('Content-Encoding')));
|
||||
|
||||
if (length(TempContentEncoding) > 0) and (TempContentEncoding <> 'identity') then
|
||||
begin
|
||||
// We can't use this information because Content-Length has the
|
||||
// compressed length but the OnFilter event has uncompressed data.
|
||||
FRscSize := -1;
|
||||
StatusBar1.Panels[0].Text := 'Content-Length : compressed';
|
||||
end
|
||||
else
|
||||
begin
|
||||
TempContentLength := trim(response.GetHeader('Content-Length'));
|
||||
|
||||
if TryStrToInt(TempContentLength, TempLen) and (TempLen > 0) then
|
||||
begin
|
||||
FRscSize := TempLen;
|
||||
StatusBar1.Panels[0].Text := 'Content-Length : ' + inttostr(FRscSize);
|
||||
end
|
||||
else
|
||||
begin
|
||||
FRscSize := -1;
|
||||
StatusBar1.Panels[0].Text := 'Content-Length : not available';
|
||||
end;
|
||||
end;
|
||||
|
||||
UpdateRscEncoding(response.MimeType, response.GetHeader('Content-Type'));
|
||||
finally
|
||||
FStreamCS.Release;
|
||||
end;
|
||||
CheckResponseHeaders(response);
|
||||
UpdateRscEncoding(response.MimeType, response.GetHeader('Content-Type'));
|
||||
end
|
||||
else
|
||||
Result := nil;
|
||||
@ -498,7 +531,43 @@ begin
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
procedure TResponseFilterBrowserFrm.Chromium1ResourceLoadComplete(Sender : TObject;
|
||||
procedure TResponseFilterBrowserFrm.CheckResponseHeaders(const response : ICefResponse);
|
||||
var
|
||||
TempContentLength, TempContentEncoding : string;
|
||||
TempLen : integer;
|
||||
begin
|
||||
try
|
||||
FStreamCS.Acquire;
|
||||
|
||||
TempContentEncoding := trim(lowercase(response.GetHeader('Content-Encoding')));
|
||||
|
||||
if (length(TempContentEncoding) > 0) and (TempContentEncoding <> 'identity') then
|
||||
begin
|
||||
// We can't use this information because Content-Length has the
|
||||
// compressed length but the OnFilter event has uncompressed data.
|
||||
FRscSize := -1;
|
||||
StatusBar1.Panels[0].Text := 'Content-Length : compressed';
|
||||
end
|
||||
else
|
||||
begin
|
||||
TempContentLength := trim(response.GetHeader('Content-Length'));
|
||||
|
||||
if (length(TempContentLength) > 0) and
|
||||
TryStrToInt(TempContentLength, TempLen) and
|
||||
(TempLen > 0) then
|
||||
begin
|
||||
FRscSize := TempLen;
|
||||
StatusBar1.Panels[0].Text := 'Content-Length : ' + inttostr(FRscSize);
|
||||
end
|
||||
else
|
||||
StatusBar1.Panels[0].Text := 'Content-Length : not available';
|
||||
end;
|
||||
finally
|
||||
FStreamCS.Release;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TResponseFilterBrowserFrm.Chromium1ResourceLoadComplete( Sender : TObject;
|
||||
const browser : ICefBrowser;
|
||||
const frame : ICefFrame;
|
||||
const request : ICefRequest;
|
||||
@ -525,6 +594,22 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TResponseFilterBrowserFrm.Chromium1ResourceResponse( Sender : TObject;
|
||||
const browser : ICefBrowser;
|
||||
const frame : ICefFrame;
|
||||
const request : ICefRequest;
|
||||
const response : ICefResponse;
|
||||
out Result : Boolean);
|
||||
begin
|
||||
Result := False;
|
||||
|
||||
if not(FRscCompleted) and (response <> nil) and IsMyResource(request) then
|
||||
begin
|
||||
CheckResponseHeaders(response);
|
||||
UpdateRscEncoding(response.MimeType, response.GetHeader('Content-Type'));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TResponseFilterBrowserFrm.BrowserCreatedMsg(var aMessage : TMessage);
|
||||
begin
|
||||
Caption := 'Response Filter Browser';
|
||||
|
Reference in New Issue
Block a user