1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-04-07 06:50:04 +02:00

Update to CEF 83.5.0

This commit is contained in:
Salvador Díaz Fau 2020-07-15 14:56:41 +02:00
parent 51658e03f2
commit 882c79ac1b
18 changed files with 398 additions and 105 deletions

View File

@ -3,10 +3,10 @@ CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chro
CEF4Delphi is based on DCEF3, made by Henri Gourvest. The original license of DCEF3 still applies to CEF4Delphi. Read the license terms in the first lines of any *.pas file. CEF4Delphi is based on DCEF3, made by Henri Gourvest. The original license of DCEF3 still applies to CEF4Delphi. Read the license terms in the first lines of any *.pas file.
CEF4Delphi uses CEF 83.4.2 which includes Chromium 83.0.4103.106. CEF4Delphi uses CEF 83.5.0 which includes Chromium 83.0.4103.106.
The CEF binaries used by CEF4Delphi are available for download at spotify : The CEF binaries used by CEF4Delphi are available for download at spotify :
* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.4.2%2Bgc8d4f85%2Bchromium-83.0.4103.106_windows32.tar.bz2) * [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.5.0%2Bgbf03589%2Bchromium-83.0.4103.106_windows32.tar.bz2)
* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.4.2%2Bgc8d4f85%2Bchromium-83.0.4103.106_windows64.tar.bz2) * [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.5.0%2Bgbf03589%2Bchromium-83.0.4103.106_windows64.tar.bz2)
CEF4Delphi was developed and tested on Delphi 10.4 and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2, Delphi 10.3 and Lazarus 2.0.10/FPC 3.2.0. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components. CEF4Delphi was developed and tested on Delphi 10.4 and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2, Delphi 10.3 and Lazarus 2.0.10/FPC 3.2.0. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components.

View File

@ -55,21 +55,43 @@ object MediaRouterFrm: TMediaRouterFrm
Left = 12 Left = 12
Top = 25 Top = 25
Width = 226 Width = 226
Height = 616 Height = 579
Align = alClient Align = alClient
ItemHeight = 13 ItemHeight = 13
TabOrder = 0 TabOrder = 0
OnClick = SinksLbxClick OnClick = SinksLbxClick
ExplicitHeight = 616
end end
object SinksButtonsPnl: TPanel object SinksButtonsPnl: TPanel
Left = 12 Left = 12
Top = 641 Top = 604
Width = 226 Width = 226
Height = 74 Height = 111
Align = alBottom Align = alBottom
BevelOuter = bvNone BevelOuter = bvNone
Padding.Top = 10 Padding.Top = 10
TabOrder = 1 TabOrder = 1
object GetDeviceInfoBtn: TButton
Left = 0
Top = 47
Width = 226
Height = 27
Caption = 'Get device info'
Enabled = False
TabOrder = 0
OnClick = GetDeviceInfoBtnClick
end
object NotifySinksBtn: TButton
Left = 0
Top = 84
Width = 226
Height = 27
Align = alBottom
Caption = 'Notify sinks'
TabOrder = 1
OnClick = NotifySinksBtnClick
ExplicitTop = 47
end
object CreateRouteBtn: TButton object CreateRouteBtn: TButton
Left = 0 Left = 0
Top = 10 Top = 10
@ -78,18 +100,9 @@ object MediaRouterFrm: TMediaRouterFrm
Align = alTop Align = alTop
Caption = 'Create route' Caption = 'Create route'
Enabled = False Enabled = False
TabOrder = 0 TabOrder = 2
OnClick = CreateRouteBtnClick OnClick = CreateRouteBtnClick
end ExplicitTop = 18
object NotifySinksBtn: TButton
Left = 0
Top = 47
Width = 226
Height = 27
Align = alBottom
Caption = 'Notify sinks'
TabOrder = 1
OnClick = NotifySinksBtnClick
end end
end end
end end
@ -125,11 +138,13 @@ object MediaRouterFrm: TMediaRouterFrm
object SourceURNLbl: TLabel object SourceURNLbl: TLabel
Left = 0 Left = 0
Top = 0 Top = 0
Width = 57 Width = 65
Height = 13 Height = 21
Align = alClient Align = alClient
Caption = 'Source URN' Caption = 'Source URN'
Layout = tlCenter Layout = tlCenter
ExplicitWidth = 57
ExplicitHeight = 13
end end
end end
object SourceURNCbx: TComboBox object SourceURNCbx: TComboBox
@ -300,6 +315,7 @@ object MediaRouterFrm: TMediaRouterFrm
end end
object Chromium1: TChromium object Chromium1: TChromium
OnMediaRouteCreateFinished = Chromium1MediaRouteCreateFinished OnMediaRouteCreateFinished = Chromium1MediaRouteCreateFinished
OnMediaSinkDeviceInfo = Chromium1MediaSinkDeviceInfo
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close OnClose = Chromium1Close

View File

@ -69,7 +69,7 @@ type
SinksGbx: TGroupBox; SinksGbx: TGroupBox;
SinksLbx: TListBox; SinksLbx: TListBox;
SinksButtonsPnl: TPanel; SinksButtonsPnl: TPanel;
CreateRouteBtn: TButton; GetDeviceInfoBtn: TButton;
CentralPnl: TPanel; CentralPnl: TPanel;
SourcePnl: TPanel; SourcePnl: TPanel;
SourceLblPnl: TPanel; SourceLblPnl: TPanel;
@ -90,6 +90,7 @@ type
ClearLogPnl: TPanel; ClearLogPnl: TPanel;
ClearLogBtn: TButton; ClearLogBtn: TButton;
SourceURNCbx: TComboBox; SourceURNCbx: TComboBox;
CreateRouteBtn: TButton;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
@ -104,11 +105,12 @@ type
procedure Chromium1RouteStateChanged(Sender: TObject; const route: ICefMediaRoute; state: TCefMediaRouteConnectionState); procedure Chromium1RouteStateChanged(Sender: TObject; const route: ICefMediaRoute; state: TCefMediaRouteConnectionState);
procedure Chromium1RouteMessageReceived(Sender: TObject; const route: ICefMediaRoute; const message_: ustring); procedure Chromium1RouteMessageReceived(Sender: TObject; const route: ICefMediaRoute; const message_: ustring);
procedure Chromium1MediaRouteCreateFinished(Sender: TObject; result: Integer; const error: ustring; const route: ICefMediaRoute); procedure Chromium1MediaRouteCreateFinished(Sender: TObject; result: Integer; const error: ustring; const route: ICefMediaRoute);
procedure Chromium1MediaSinkDeviceInfo(Sender: TObject; const ip_address: ustring; port: Integer; const model_name: ustring);
procedure Timer1Timer(Sender: TObject); procedure Timer1Timer(Sender: TObject);
procedure SourceURNEdtChange(Sender: TObject); procedure SourceURNEdtChange(Sender: TObject);
procedure SinksLbxClick(Sender: TObject); procedure SinksLbxClick(Sender: TObject);
procedure CreateRouteBtnClick(Sender: TObject); procedure GetDeviceInfoBtnClick(Sender: TObject);
procedure TerminateRouteBtnClick(Sender: TObject); procedure TerminateRouteBtnClick(Sender: TObject);
procedure SendMsgBtnClick(Sender: TObject); procedure SendMsgBtnClick(Sender: TObject);
procedure NotifySinksBtnClick(Sender: TObject); procedure NotifySinksBtnClick(Sender: TObject);
@ -116,6 +118,7 @@ type
procedure ClearLogBtnClick(Sender: TObject); procedure ClearLogBtnClick(Sender: TObject);
procedure MessageMemChange(Sender: TObject); procedure MessageMemChange(Sender: TObject);
procedure RoutesLbxClick(Sender: TObject); procedure RoutesLbxClick(Sender: TObject);
procedure CreateRouteBtnClick(Sender: TObject);
protected protected
// Variables to control when can we destroy the form safely // Variables to control when can we destroy the form safely
@ -265,6 +268,22 @@ begin
end; end;
end; end;
procedure TMediaRouterFrm.Chromium1MediaSinkDeviceInfo(Sender: TObject;
const ip_address: ustring; port: Integer; const model_name: ustring);
begin
try
FMediaCS.Acquire;
FLog.Add('Sink device info');
FLog.Add('IP address : ' + ip_address);
FLog.Add('Port : ' + inttostr(port));
FLog.Add('Model name : ' + model_name);
FLog.Add('------------------------------------------');
finally
PostMessage(Handle, MEDIA_ROUTER_PENDING_LOG_LINES, 0, 0);
FMediaCS.Release;
end;
end;
procedure TMediaRouterFrm.Chromium1RouteMessageReceived(Sender: TObject; procedure TMediaRouterFrm.Chromium1RouteMessageReceived(Sender: TObject;
const route: ICefMediaRoute; const message_: ustring); const route: ICefMediaRoute; const message_: ustring);
var var
@ -323,6 +342,8 @@ begin
FClosing := True; FClosing := True;
Visible := False; Visible := False;
DestroyAllArrays; DestroyAllArrays;
Chromium1.ExecuteDevToolsMethod(0, 'Cast.disable', nil);
sleep(500);
Chromium1.CloseBrowser(True); Chromium1.CloseBrowser(True);
end; end;
end; end;
@ -546,6 +567,64 @@ begin
end; end;
end; end;
procedure TMediaRouterFrm.CreateRouteBtnClick(Sender: TObject);
var
TempURN, TempErrorMsg : string;
TempSource : ICefMediaSource;
begin
TempURN := trim(SourceURNCbx.Text);
if (length(TempURN) = 0) then
begin
AddLogEntry('Invalid URN');
exit;
end;
TempErrorMsg := '';
try
try
FMediaCS.Acquire;
if (FSinks <> nil) and
(SinksLbx.Items.Count > 0) and
(SinksLbx.ItemIndex >= 0) and
(SinksLbx.ItemIndex < length(FSinks)) then
begin
TempSource := Chromium1.GetSource(TempURN);
if (TempSource <> nil) and TempSource.IsValid then
begin
if (FSinks[SinksLbx.ItemIndex].SinkIntf <> nil) and
FSinks[SinksLbx.ItemIndex].SinkIntf.IsValid then
begin
if FSinks[SinksLbx.ItemIndex].SinkIntf.IsCompatibleWith(TempSource) then
Chromium1.CreateRoute(TempSource, FSinks[SinksLbx.ItemIndex].SinkIntf)
else
TempErrorMsg := 'The selected Sink is not compatible with the Media Source.';
end
else
TempErrorMsg := 'The selected Sink is not valid.';
end
else
TempErrorMsg := 'The Media Source is not valid.';
end
else
TempErrorMsg := 'The sinks list is outdated.';
except
on e : exception do
begin
TempErrorMsg := e.Message;
if CustomExceptionHandler('TMediaRouterFrm.CreateRouteBtnClick', e) then raise;
end;
end;
finally
TempSource := nil;
FMediaCS.Release;
if (length(TempErrorMsg) > 0) then AddLogEntry(TempErrorMsg);
end;
end;
procedure TMediaRouterFrm.CopySinksArray(const aSinks : TCefMediaSinkArray); procedure TMediaRouterFrm.CopySinksArray(const aSinks : TCefMediaSinkArray);
var var
i, TempLen : integer; i, TempLen : integer;
@ -623,22 +702,8 @@ begin
end; end;
end; end;
procedure TMediaRouterFrm.CreateRouteBtnClick(Sender: TObject); procedure TMediaRouterFrm.GetDeviceInfoBtnClick(Sender: TObject);
var
TempURN, TempErrorMsg : string;
TempSource : ICefMediaSource;
begin begin
TempURN := trim(SourceURNCbx.Text);
if (length(TempURN) = 0) then
begin
AddLogEntry('Invalid URN');
exit;
end;
TempErrorMsg := '';
try
try try
FMediaCS.Acquire; FMediaCS.Acquire;
@ -646,38 +711,9 @@ begin
(SinksLbx.Items.Count > 0) and (SinksLbx.Items.Count > 0) and
(SinksLbx.ItemIndex >= 0) and (SinksLbx.ItemIndex >= 0) and
(SinksLbx.ItemIndex < length(FSinks)) then (SinksLbx.ItemIndex < length(FSinks)) then
begin Chromium1.GetDeviceInfo(FSinks[SinksLbx.ItemIndex].SinkIntf);
TempSource := Chromium1.GetSource(TempURN);
if (TempSource <> nil) and TempSource.IsValid then
begin
if (FSinks[SinksLbx.ItemIndex].SinkIntf <> nil) and
FSinks[SinksLbx.ItemIndex].SinkIntf.IsValid then
begin
if FSinks[SinksLbx.ItemIndex].SinkIntf.IsCompatibleWith(TempSource) then
Chromium1.CreateRoute(TempSource, FSinks[SinksLbx.ItemIndex].SinkIntf)
else
TempErrorMsg := 'The selected Sink is not compatible with the Media Source.';
end
else
TempErrorMsg := 'The selected Sink is not valid.';
end
else
TempErrorMsg := 'The Media Source is not valid.';
end
else
TempErrorMsg := 'The sinks list is outdated.';
except
on e : exception do
begin
TempErrorMsg := e.Message;
if CustomExceptionHandler('TMediaRouterFrm.CreateRouteBtnClick', e) then raise;
end;
end;
finally finally
TempSource := nil;
FMediaCS.Release; FMediaCS.Release;
if (length(TempErrorMsg) > 0) then AddLogEntry(TempErrorMsg);
end; end;
end; end;
@ -754,10 +790,12 @@ begin
SendMsgBtn.Enabled := TerminateRouteBtn.Enabled and SendMsgBtn.Enabled := TerminateRouteBtn.Enabled and
(length(trim(MessageMem.Lines.Text)) > 0); (length(trim(MessageMem.Lines.Text)) > 0);
CreateRouteBtn.Enabled := not(TerminateRouteBtn.Enabled) and GetDeviceInfoBtn.Enabled := (SinksLbx.ItemIndex >= 0) and
(length(trim(SourceURNCbx.Text)) > 0) and
(SinksLbx.ItemIndex >= 0) and
(SinksLbx.Items.Count > 0); (SinksLbx.Items.Count > 0);
CreateRouteBtn.Enabled := not(TerminateRouteBtn.Enabled) and
GetDeviceInfoBtn.Enabled and
(length(trim(SourceURNCbx.Text)) > 0);
end; end;
procedure TMediaRouterFrm.AddLogEntry(const aMessage1, aMessage2 : string; aRec : boolean); procedure TMediaRouterFrm.AddLogEntry(const aMessage1, aMessage2 : string; aRec : boolean);

View File

@ -215,7 +215,8 @@ contains
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas', uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas', uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas', uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas'; uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas',
uCEFMediaSinkDeviceInfoCallback in '..\source\uCEFMediaSinkDeviceInfoCallback.pas';
end. end.

View File

@ -212,6 +212,7 @@ contains
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas', uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas', uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas', uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas'; uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas',
uCEFMediaSinkDeviceInfoCallback in '..\source\uCEFMediaSinkDeviceInfoCallback.pas';
end. end.

View File

@ -220,7 +220,8 @@ contains
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas', uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas', uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas', uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas'; uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas',
uCEFMediaSinkDeviceInfoCallback in '..\source\uCEFMediaSinkDeviceInfoCallback.pas';
end. end.

View File

@ -336,6 +336,7 @@
<DCCReference Include="..\source\uCEFMenuButtonComponent.pas"/> <DCCReference Include="..\source\uCEFMenuButtonComponent.pas"/>
<DCCReference Include="..\source\uCEFAudioHandler.pas"/> <DCCReference Include="..\source\uCEFAudioHandler.pas"/>
<DCCReference Include="..\source\uCEFDevToolsMessageObserver.pas"/> <DCCReference Include="..\source\uCEFDevToolsMessageObserver.pas"/>
<DCCReference Include="..\source\uCEFMediaSinkDeviceInfoCallback.pas"/>
<BuildConfiguration Include="Base"> <BuildConfiguration Include="Base">
<Key>Base</Key> <Key>Base</Key>
</BuildConfiguration> </BuildConfiguration>

View File

@ -21,8 +21,8 @@
</CompilerOptions> </CompilerOptions>
<Description Value="CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chromium-based browsers in applications made with Delphi or Lazarus/FPC."/> <Description Value="CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chromium-based browsers in applications made with Delphi or Lazarus/FPC."/>
<License Value="MPL 1.1"/> <License Value="MPL 1.1"/>
<Version Major="83" Minor="4" Release="2"/> <Version Major="83" Minor="5"/>
<Files Count="187"> <Files Count="188">
<Item1> <Item1>
<Filename Value="..\source\uCEFAccessibilityHandler.pas"/> <Filename Value="..\source\uCEFAccessibilityHandler.pas"/>
<UnitName Value="uCEFAccessibilityHandler"/> <UnitName Value="uCEFAccessibilityHandler"/>
@ -787,6 +787,10 @@
<Filename Value="..\source\uCEFDevToolsMessageObserver.pas"/> <Filename Value="..\source\uCEFDevToolsMessageObserver.pas"/>
<UnitName Value="uCEFDevToolsMessageObserver"/> <UnitName Value="uCEFDevToolsMessageObserver"/>
</Item187> </Item187>
<Item188>
<Filename Value="..\source\uCEFMediaSinkDeviceInfoCallback.pas"/>
<UnitName Value="uCEFMediaSinkDeviceInfoCallback"/>
</Item188>
</Files> </Files>
<RequiredPkgs Count="4"> <RequiredPkgs Count="4">
<Item1> <Item1>

View File

@ -62,7 +62,7 @@ uses
uCEFBrowserViewComponent, uCEFWindowComponent, uCEFPanelComponent, uCEFBrowserViewComponent, uCEFWindowComponent, uCEFPanelComponent,
uCEFScrollViewComponent, uCEFTextfieldComponent, uCEFViewComponent, uCEFScrollViewComponent, uCEFTextfieldComponent, uCEFViewComponent,
uCEFViewsFrameworkEvents, uCEFAudioHandler, uCEFDevToolsMessageObserver, uCEFViewsFrameworkEvents, uCEFAudioHandler, uCEFDevToolsMessageObserver,
LazarusPackageIntf; uCEFMediaSinkDeviceInfoCallback, LazarusPackageIntf;
implementation implementation

View File

@ -61,8 +61,8 @@ uses
const const
CEF_SUPPORTED_VERSION_MAJOR = 83; CEF_SUPPORTED_VERSION_MAJOR = 83;
CEF_SUPPORTED_VERSION_MINOR = 4; CEF_SUPPORTED_VERSION_MINOR = 5;
CEF_SUPPORTED_VERSION_RELEASE = 2; CEF_SUPPORTED_VERSION_RELEASE = 0;
CEF_SUPPORTED_VERSION_BUILD = 0; CEF_SUPPORTED_VERSION_BUILD = 0;
CEF_CHROMEELF_VERSION_MAJOR = 83; CEF_CHROMEELF_VERSION_MAJOR = 83;

View File

@ -299,6 +299,7 @@ type
FOnCookieSet : TOnCookieSet; FOnCookieSet : TOnCookieSet;
FOnZoomPctAvailable : TOnZoomPctAvailable; FOnZoomPctAvailable : TOnZoomPctAvailable;
FOnMediaRouteCreateFinished : TOnMediaRouteCreateFinishedEvent; FOnMediaRouteCreateFinished : TOnMediaRouteCreateFinishedEvent;
FOnMediaSinkDeviceInfo : TOnMediaSinkDeviceInfoEvent;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
FOnBrowserCompMsg : TOnCompMsgEvent; FOnBrowserCompMsg : TOnCompMsgEvent;
FOnWidgetCompMsg : TOnCompMsgEvent; FOnWidgetCompMsg : TOnCompMsgEvent;
@ -612,6 +613,7 @@ type
procedure doSetZoomPct(const aValue : double); virtual; procedure doSetZoomPct(const aValue : double); virtual;
procedure doSetZoomStep(aValue : byte); virtual; procedure doSetZoomStep(aValue : byte); virtual;
procedure doMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute); virtual; procedure doMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute); virtual;
procedure doOnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring); virtual;
function MustCreateAudioHandler : boolean; virtual; function MustCreateAudioHandler : boolean; virtual;
function MustCreateDevToolsMessageObserver : boolean; virtual; function MustCreateDevToolsMessageObserver : boolean; virtual;
function MustCreateLoadHandler : boolean; virtual; function MustCreateLoadHandler : boolean; virtual;
@ -779,6 +781,7 @@ type
procedure NotifyCurrentSinks; procedure NotifyCurrentSinks;
procedure NotifyCurrentRoutes; procedure NotifyCurrentRoutes;
procedure CreateRoute(const source: ICefMediaSource; const sink: ICefMediaSink); procedure CreateRoute(const source: ICefMediaSource; const sink: ICefMediaSink);
procedure GetDeviceInfo(const aMediaSink: ICefMediaSink);
property DefaultUrl : ustring read FDefaultUrl write FDefaultUrl; property DefaultUrl : ustring read FDefaultUrl write FDefaultUrl;
property Options : TChromiumOptions read FOptions write FOptions; property Options : TChromiumOptions read FOptions write FOptions;
@ -882,6 +885,7 @@ type
property OnCookieSet : TOnCookieSet read FOnCookieSet write FOnCookieSet; property OnCookieSet : TOnCookieSet read FOnCookieSet write FOnCookieSet;
property OnZoomPctAvailable : TOnZoomPctAvailable read FOnZoomPctAvailable write FOnZoomPctAvailable; property OnZoomPctAvailable : TOnZoomPctAvailable read FOnZoomPctAvailable write FOnZoomPctAvailable;
property OnMediaRouteCreateFinished : TOnMediaRouteCreateFinishedEvent read FOnMediaRouteCreateFinished write FOnMediaRouteCreateFinished; property OnMediaRouteCreateFinished : TOnMediaRouteCreateFinishedEvent read FOnMediaRouteCreateFinished write FOnMediaRouteCreateFinished;
property OnMediaSinkDeviceInfo : TOnMediaSinkDeviceInfoEvent read FOnMediaSinkDeviceInfo write FOnMediaSinkDeviceInfo;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg; property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg;
property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg; property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg;
@ -1099,7 +1103,8 @@ uses
uCEFStringVisitor, uCEFListValue, uCEFNavigationEntryVisitor, uCEFStringVisitor, uCEFListValue, uCEFNavigationEntryVisitor,
uCEFDownloadImageCallBack, uCEFCookieManager, uCEFRequestContextHandler, uCEFDownloadImageCallBack, uCEFCookieManager, uCEFRequestContextHandler,
uCEFCookieVisitor, uCEFSetCookieCallback, uCEFResourceRequestHandler, uCEFCookieVisitor, uCEFSetCookieCallback, uCEFResourceRequestHandler,
uCEFMediaObserver, uCEFMediaRouteCreateCallback ,uCEFDevToolsMessageObserver; uCEFMediaObserver, uCEFMediaRouteCreateCallback ,uCEFDevToolsMessageObserver,
uCEFMediaSinkDeviceInfoCallback;
constructor TChromiumCore.Create(AOwner: TComponent); constructor TChromiumCore.Create(AOwner: TComponent);
begin begin
@ -1681,6 +1686,7 @@ begin
FOnCookieSet := nil; FOnCookieSet := nil;
FOnZoomPctAvailable := nil; FOnZoomPctAvailable := nil;
FOnMediaRouteCreateFinished := nil; FOnMediaRouteCreateFinished := nil;
FOnMediaSinkDeviceInfo := nil;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
FOnBrowserCompMsg := nil; FOnBrowserCompMsg := nil;
@ -4628,6 +4634,12 @@ begin
FOnMediaRouteCreateFinished(self, result, error, route); FOnMediaRouteCreateFinished(self, result, error, route);
end; end;
procedure TChromiumCore.doOnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring);
begin
if assigned(FOnMediaSinkDeviceInfo) then
FOnMediaSinkDeviceInfo(self, ip_address, port, model_name);
end;
function TChromiumCore.MustCreateLoadHandler : boolean; function TChromiumCore.MustCreateLoadHandler : boolean;
begin begin
Result := assigned(FOnLoadStart) or Result := assigned(FOnLoadStart) or
@ -6424,6 +6436,19 @@ begin
end; end;
end; end;
procedure TChromiumCore.GetDeviceInfo(const aMediaSink: ICefMediaSink);
var
TempCallback : ICefMediaSinkDeviceInfoCallback;
begin
if (aMediaSink <> nil) then
try
TempCallback := TCefCustomMediaSinkDeviceInfoCallback.Create(self);
aMediaSink.GetDeviceInfo(TempCallback);
finally
TempCallback := nil;
end;
end;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
function TChromiumCore.CopyDCToBitmapStream(aSrcDC : HDC; const aSrcRect : TRect; var aStream : TStream) : boolean; function TChromiumCore.CopyDCToBitmapStream(aSrcDC : HDC; const aSrcRect : TRect; var aStream : TStream) : boolean;
var var

View File

@ -201,6 +201,7 @@ type
TOnCookieSet = procedure(Sender: TObject; aSuccess : boolean; aID : integer) of object; TOnCookieSet = procedure(Sender: TObject; aSuccess : boolean; aID : integer) of object;
TOnZoomPctAvailable = procedure(Sender: TObject; const aZoomPct : double) of object; TOnZoomPctAvailable = procedure(Sender: TObject; const aZoomPct : double) of object;
TOnMediaRouteCreateFinishedEvent = procedure(Sender: TObject; result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute) of object; TOnMediaRouteCreateFinishedEvent = procedure(Sender: TObject; result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute) of object;
TOnMediaSinkDeviceInfoEvent = procedure(Sender: TObject; const ip_address: ustring; port: integer; const model_name: ustring) of object;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
TOnCompMsgEvent = procedure(var aMessage: TMessage; var aHandled: Boolean) of object; TOnCompMsgEvent = procedure(var aMessage: TMessage; var aHandled: Boolean) of object;
{$ENDIF} {$ENDIF}

View File

@ -149,6 +149,7 @@ type
ICefMediaRoute = interface; ICefMediaRoute = interface;
ICefMediaRouteCreateCallback = interface; ICefMediaRouteCreateCallback = interface;
ICefMediaSink = interface; ICefMediaSink = interface;
ICefMediaSinkDeviceInfoCallback = interface;
ICefMediaSource = interface; ICefMediaSource = interface;
ICefAudioHandler = interface; ICefAudioHandler = interface;
ICefDevToolsMessageObserver = interface; ICefDevToolsMessageObserver = interface;
@ -248,7 +249,7 @@ type
TOnDownloadImageFinishedProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage); TOnDownloadImageFinishedProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage);
TCefCookieVisitorProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} function(const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total: Integer; same_site : TCefCookieSameSite; priority : TCefCookiePriority; out deleteCookie: Boolean): Boolean; TCefCookieVisitorProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} function(const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total: Integer; same_site : TCefCookieSameSite; priority : TCefCookiePriority; out deleteCookie: Boolean): Boolean;
TCefMediaRouteCreateCallbackProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute); TCefMediaRouteCreateCallbackProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute);
TCefMediaSinkDeviceInfoCallbackProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(const ip_address: ustring; port: integer; const model_name: ustring);
// ******************************************* // *******************************************
// ************ Custom interfaces ************ // ************ Custom interfaces ************
@ -464,6 +465,7 @@ type
procedure doSetZoomStep(aValue : byte); procedure doSetZoomStep(aValue : byte);
procedure doReadZoom; procedure doReadZoom;
procedure doMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute); procedure doMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute);
procedure doOnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring);
function MustCreateAudioHandler : boolean; function MustCreateAudioHandler : boolean;
function MustCreateLoadHandler : boolean; function MustCreateLoadHandler : boolean;
function MustCreateFocusHandler : boolean; function MustCreateFocusHandler : boolean;
@ -1366,6 +1368,12 @@ type
procedure OnMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute); procedure OnMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute);
end; end;
//
ICefMediaSinkDeviceInfoCallback = interface(ICefBaseRefCounted)
['{633898DD-4169-45D0-ADDD-6E68B3686E0D}']
procedure OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring);
end;
// TCefMediaSink // TCefMediaSink
// /include/capi/cef_media_router_capi.h (cef_media_sink_t) // /include/capi/cef_media_router_capi.h (cef_media_sink_t)
ICefMediaSink = interface(ICefBaseRefCounted) ICefMediaSink = interface(ICefBaseRefCounted)
@ -1375,6 +1383,7 @@ type
function GetName: ustring; function GetName: ustring;
function GetDescription: ustring; function GetDescription: ustring;
function GetIconType: TCefMediaSinkIconType; function GetIconType: TCefMediaSinkIconType;
procedure GetDeviceInfo(const callback: ICefMediaSinkDeviceInfoCallback);
function IsCastSink: boolean; function IsCastSink: boolean;
function IsDialSink: boolean; function IsDialSink: boolean;
function IsCompatibleWith(const source: ICefMediaSource): boolean; function IsCompatibleWith(const source: ICefMediaSource): boolean;

View File

@ -180,7 +180,4 @@ begin
end; end;
end; end;
end. end.

View File

@ -59,6 +59,7 @@ type
function GetName: ustring; function GetName: ustring;
function GetDescription: ustring; function GetDescription: ustring;
function GetIconType: TCefMediaSinkIconType; function GetIconType: TCefMediaSinkIconType;
procedure GetDeviceInfo(const callback: ICefMediaSinkDeviceInfoCallback);
function IsCastSink: boolean; function IsCastSink: boolean;
function IsDialSink: boolean; function IsDialSink: boolean;
function IsCompatibleWith(const source: ICefMediaSource): boolean; function IsCompatibleWith(const source: ICefMediaSource): boolean;
@ -96,6 +97,11 @@ begin
Result := PCefMediaSink(FData)^.get_icon_type(PCefMediaSink(FData)); Result := PCefMediaSink(FData)^.get_icon_type(PCefMediaSink(FData));
end; end;
procedure TCefMediaSinkRef.GetDeviceInfo(const callback: ICefMediaSinkDeviceInfoCallback);
begin
PCefMediaSink(FData)^.get_device_info(PCefMediaSink(FData), CefGetData(callback));
end;
function TCefMediaSinkRef.IsCastSink: Boolean; function TCefMediaSinkRef.IsCastSink: Boolean;
begin begin
Result := PCefMediaSink(FData)^.is_cast_sink(PCefMediaSink(FData)) <> 0; Result := PCefMediaSink(FData)^.is_cast_sink(PCefMediaSink(FData)) <> 0;

View File

@ -0,0 +1,177 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF to embed a chromium-based
// browser in Delphi applications.
//
// The original license of DCEF3 still applies to CEF4Delphi.
//
// For more information about CEF4Delphi visit :
// https://www.briskbard.com/index.php?lang=en&pageid=cef
//
// Copyright © 2020 Salvador Diaz Fau. All rights reserved.
//
// ************************************************************************
// ************ vvvv Original license and comments below vvvv *************
// ************************************************************************
(*
* Delphi Chromium Embedded 3
*
* Usage allowed under the restrictions of the Lesser GNU General Public License
* or alternatively the restrictions of the Mozilla Public License 1.1
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* Unit owner : Henri Gourvest <hgourvest@gmail.com>
* Web site : http://www.progdigy.com
* Repository : http://code.google.com/p/delphichromiumembedded/
* Group : http://groups.google.com/group/delphichromiumembedded
*
* Embarcadero Technologies, Inc is not permitted to use or redistribute
* this source code without explicit permission.
*
*)
unit uCEFMediaSinkDeviceInfoCallback;
{$IFDEF FPC}
{$MODE OBJFPC}{$H+}
{$ENDIF}
{$IFNDEF CPUX64}{$ALIGN ON}{$ENDIF}
{$MINENUMSIZE 4}
{$I cef.inc}
interface
uses
uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes;
type
TCefMediaSinkDeviceInfoCallbackOwn = class(TCefBaseRefCountedOwn, ICefMediaSinkDeviceInfoCallback)
protected
procedure OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring); virtual; abstract;
public
constructor Create; virtual;
end;
TCefFastMediaSinkDeviceInfoCallback = class(TCefMediaSinkDeviceInfoCallbackOwn)
protected
FCallback: TCefMediaSinkDeviceInfoCallbackProc;
procedure OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring); override;
public
constructor Create(const callback: TCefMediaSinkDeviceInfoCallbackProc); reintroduce;
destructor Destroy; override;
end;
TCefCustomMediaSinkDeviceInfoCallback = class(TCefMediaSinkDeviceInfoCallbackOwn)
protected
FEvents : Pointer;
procedure OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring); override;
public
constructor Create(const aEvents : IChromiumEvents); reintroduce;
destructor Destroy; override;
end;
implementation
uses
{$IFDEF DELPHI16_UP}
System.SysUtils,
{$ELSE}
SysUtils,
{$ENDIF}
uCEFMiscFunctions, uCEFLibFunctions, uCEFMediaSink;
procedure cef_media_sink_device_info_callback_on_media_sink_device_info(self : PCefMediaSinkDeviceInfoCallback;
device_info : PCefMediaSinkDeviceInfo); stdcall;
var
TempObject : TObject;
begin
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefMediaSinkDeviceInfoCallbackOwn) then
TCefMediaSinkDeviceInfoCallbackOwn(TempObject).OnMediaSinkDeviceInfo(CefString(@device_info^.ip_address),
device_info^.port,
CefString(@device_info^.model_name));
end;
// ****************************************************************
// ************** TCefMediaSinkDeviceInfoCallbackOwn **************
// ****************************************************************
constructor TCefMediaSinkDeviceInfoCallbackOwn.Create;
begin
inherited CreateData(SizeOf(TCefMediaSinkDeviceInfoCallback));
PCefMediaSinkDeviceInfoCallback(FData)^.on_media_sink_device_info :=
{$IFDEF FPC}@{$ENDIF}cef_media_sink_device_info_callback_on_media_sink_device_info;
end;
// *****************************************************************
// ************** TCefFastMediaSinkDeviceInfoCallback **************
// *****************************************************************
constructor TCefFastMediaSinkDeviceInfoCallback.Create(const callback: TCefMediaSinkDeviceInfoCallbackProc);
begin
inherited Create;
FCallback := callback;
end;
procedure TCefFastMediaSinkDeviceInfoCallback.OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring);
begin
if assigned(FCallback) then
FCallback(ip_address, port, model_name);
end;
destructor TCefFastMediaSinkDeviceInfoCallback.Destroy;
begin
FCallback := nil;
inherited Destroy;
end;
// *******************************************************************
// ************** TCefCustomMediaSinkDeviceInfoCallback **************
// *******************************************************************
constructor TCefCustomMediaSinkDeviceInfoCallback.Create(const aEvents : IChromiumEvents);
begin
inherited Create;
FEvents := Pointer(aEvents);
end;
destructor TCefCustomMediaSinkDeviceInfoCallback.Destroy;
begin
FEvents := nil;
inherited Destroy;
end;
procedure TCefCustomMediaSinkDeviceInfoCallback.OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring);
begin
try
try
if (FEvents <> nil) then
IChromiumEvents(FEvents).doOnMediaSinkDeviceInfo(ip_address, port, model_name);
except
on e : exception do
if CustomExceptionHandler('TCefCustomMediaSinkDeviceInfoCallback.OnMediaSinkDeviceInfo', e) then raise;
end;
finally
FEvents := nil;
end;
end;
end.

View File

@ -246,7 +246,9 @@ type
PCefMediaObserver = ^TCefMediaObserver; PCefMediaObserver = ^TCefMediaObserver;
PCefMediaSink = ^TCefMediaSink; PCefMediaSink = ^TCefMediaSink;
PPCefMediaSink = ^PCefMediaSink; PPCefMediaSink = ^PCefMediaSink;
PCefMediaSinkDeviceInfoCallback = ^TCefMediaSinkDeviceInfoCallback;
PCefMediaSource = ^TCefMediaSource; PCefMediaSource = ^TCefMediaSource;
PCefMediaSinkDeviceInfo = ^TCefMediaSinkDeviceInfo;
{$IFDEF LINUX} {$IFDEF LINUX}
PXEvent = Pointer; PXEvent = Pointer;
@ -1421,6 +1423,13 @@ type
frames_per_buffer : integer; frames_per_buffer : integer;
end; end;
// /include/internal/cef_types.h (cef_media_sink_device_info_t)
TCefMediaSinkDeviceInfo = record
ip_address : TCefString;
port : integer;
model_name : TCefString;
end;
// /include/capi/cef_base_capi.h (cef_base_ref_counted_t) // /include/capi/cef_base_capi.h (cef_base_ref_counted_t)
TCefBaseRefCounted = record TCefBaseRefCounted = record
size : NativeUInt; size : NativeUInt;
@ -1649,11 +1658,18 @@ type
get_name : function(self: PCefMediaSink): PCefStringUserFree; stdcall; get_name : function(self: PCefMediaSink): PCefStringUserFree; stdcall;
get_description : function(self: PCefMediaSink): PCefStringUserFree; stdcall; get_description : function(self: PCefMediaSink): PCefStringUserFree; stdcall;
get_icon_type : function(self: PCefMediaSink): TCefMediaSinkIconType; stdcall; get_icon_type : function(self: PCefMediaSink): TCefMediaSinkIconType; stdcall;
get_device_info : procedure(self: PCefMediaSink; callback: PCefMediaSinkDeviceInfoCallback); stdcall;
is_cast_sink : function(self: PCefMediaSink): Integer; stdcall; is_cast_sink : function(self: PCefMediaSink): Integer; stdcall;
is_dial_sink : function(self: PCefMediaSink): Integer; stdcall; is_dial_sink : function(self: PCefMediaSink): Integer; stdcall;
is_compatible_with : function(self: PCefMediaSink; source: PCefMediaSource): Integer; stdcall; is_compatible_with : function(self: PCefMediaSink; source: PCefMediaSource): Integer; stdcall;
end; end;
// /include/capi/cef_media_router_capi.h (cef_media_sink_device_info_callback_t)
TCefMediaSinkDeviceInfoCallback = record
base : TCefBaseRefCounted;
on_media_sink_device_info : procedure(self: PCefMediaSinkDeviceInfoCallback; device_info: PCefMediaSinkDeviceInfo); stdcall;
end;
// /include/capi/cef_media_router_capi.h (cef_media_source_t) // /include/capi/cef_media_router_capi.h (cef_media_source_t)
TCefMediaSource = record TCefMediaSource = record
base : TCefBaseRefCounted; base : TCefBaseRefCounted;

View File

@ -2,9 +2,9 @@
"UpdateLazPackages" : [ "UpdateLazPackages" : [
{ {
"ForceNotify" : true, "ForceNotify" : true,
"InternalVersion" : 160, "InternalVersion" : 161,
"Name" : "cef4delphi_lazarus.lpk", "Name" : "cef4delphi_lazarus.lpk",
"Version" : "83.4.2.0" "Version" : "83.5.0.0"
} }
], ],
"UpdatePackageData" : { "UpdatePackageData" : {