mirror of
https://github.com/salvadordf/CEF4Delphi.git
synced 2025-02-02 10:25:26 +02:00
Update to CEF 83.5.0
This commit is contained in:
parent
51658e03f2
commit
882c79ac1b
@ -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 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 :
|
||||
* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.4.2%2Bgc8d4f85%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)
|
||||
* [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.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.
|
||||
|
@ -55,21 +55,43 @@ object MediaRouterFrm: TMediaRouterFrm
|
||||
Left = 12
|
||||
Top = 25
|
||||
Width = 226
|
||||
Height = 616
|
||||
Height = 579
|
||||
Align = alClient
|
||||
ItemHeight = 13
|
||||
TabOrder = 0
|
||||
OnClick = SinksLbxClick
|
||||
ExplicitHeight = 616
|
||||
end
|
||||
object SinksButtonsPnl: TPanel
|
||||
Left = 12
|
||||
Top = 641
|
||||
Top = 604
|
||||
Width = 226
|
||||
Height = 74
|
||||
Height = 111
|
||||
Align = alBottom
|
||||
BevelOuter = bvNone
|
||||
Padding.Top = 10
|
||||
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
|
||||
Left = 0
|
||||
Top = 10
|
||||
@ -78,18 +100,9 @@ object MediaRouterFrm: TMediaRouterFrm
|
||||
Align = alTop
|
||||
Caption = 'Create route'
|
||||
Enabled = False
|
||||
TabOrder = 0
|
||||
TabOrder = 2
|
||||
OnClick = CreateRouteBtnClick
|
||||
end
|
||||
object NotifySinksBtn: TButton
|
||||
Left = 0
|
||||
Top = 47
|
||||
Width = 226
|
||||
Height = 27
|
||||
Align = alBottom
|
||||
Caption = 'Notify sinks'
|
||||
TabOrder = 1
|
||||
OnClick = NotifySinksBtnClick
|
||||
ExplicitTop = 18
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -125,11 +138,13 @@ object MediaRouterFrm: TMediaRouterFrm
|
||||
object SourceURNLbl: TLabel
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 57
|
||||
Height = 13
|
||||
Width = 65
|
||||
Height = 21
|
||||
Align = alClient
|
||||
Caption = 'Source URN'
|
||||
Layout = tlCenter
|
||||
ExplicitWidth = 57
|
||||
ExplicitHeight = 13
|
||||
end
|
||||
end
|
||||
object SourceURNCbx: TComboBox
|
||||
@ -300,6 +315,7 @@ object MediaRouterFrm: TMediaRouterFrm
|
||||
end
|
||||
object Chromium1: TChromium
|
||||
OnMediaRouteCreateFinished = Chromium1MediaRouteCreateFinished
|
||||
OnMediaSinkDeviceInfo = Chromium1MediaSinkDeviceInfo
|
||||
OnAfterCreated = Chromium1AfterCreated
|
||||
OnBeforeClose = Chromium1BeforeClose
|
||||
OnClose = Chromium1Close
|
||||
|
@ -69,7 +69,7 @@ type
|
||||
SinksGbx: TGroupBox;
|
||||
SinksLbx: TListBox;
|
||||
SinksButtonsPnl: TPanel;
|
||||
CreateRouteBtn: TButton;
|
||||
GetDeviceInfoBtn: TButton;
|
||||
CentralPnl: TPanel;
|
||||
SourcePnl: TPanel;
|
||||
SourceLblPnl: TPanel;
|
||||
@ -90,6 +90,7 @@ type
|
||||
ClearLogPnl: TPanel;
|
||||
ClearLogBtn: TButton;
|
||||
SourceURNCbx: TComboBox;
|
||||
CreateRouteBtn: TButton;
|
||||
|
||||
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
||||
procedure FormCreate(Sender: TObject);
|
||||
@ -104,11 +105,12 @@ type
|
||||
procedure Chromium1RouteStateChanged(Sender: TObject; const route: ICefMediaRoute; state: TCefMediaRouteConnectionState);
|
||||
procedure Chromium1RouteMessageReceived(Sender: TObject; const route: ICefMediaRoute; const message_: ustring);
|
||||
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 SourceURNEdtChange(Sender: TObject);
|
||||
procedure SinksLbxClick(Sender: TObject);
|
||||
procedure CreateRouteBtnClick(Sender: TObject);
|
||||
procedure GetDeviceInfoBtnClick(Sender: TObject);
|
||||
procedure TerminateRouteBtnClick(Sender: TObject);
|
||||
procedure SendMsgBtnClick(Sender: TObject);
|
||||
procedure NotifySinksBtnClick(Sender: TObject);
|
||||
@ -116,6 +118,7 @@ type
|
||||
procedure ClearLogBtnClick(Sender: TObject);
|
||||
procedure MessageMemChange(Sender: TObject);
|
||||
procedure RoutesLbxClick(Sender: TObject);
|
||||
procedure CreateRouteBtnClick(Sender: TObject);
|
||||
|
||||
protected
|
||||
// Variables to control when can we destroy the form safely
|
||||
@ -265,6 +268,22 @@ begin
|
||||
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;
|
||||
const route: ICefMediaRoute; const message_: ustring);
|
||||
var
|
||||
@ -323,6 +342,8 @@ begin
|
||||
FClosing := True;
|
||||
Visible := False;
|
||||
DestroyAllArrays;
|
||||
Chromium1.ExecuteDevToolsMethod(0, 'Cast.disable', nil);
|
||||
sleep(500);
|
||||
Chromium1.CloseBrowser(True);
|
||||
end;
|
||||
end;
|
||||
@ -546,6 +567,64 @@ begin
|
||||
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);
|
||||
var
|
||||
i, TempLen : integer;
|
||||
@ -623,61 +702,18 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TMediaRouterFrm.CreateRouteBtnClick(Sender: TObject);
|
||||
var
|
||||
TempURN, TempErrorMsg : string;
|
||||
TempSource : ICefMediaSource;
|
||||
procedure TMediaRouterFrm.GetDeviceInfoBtnClick(Sender: TObject);
|
||||
begin
|
||||
TempURN := trim(SourceURNCbx.Text);
|
||||
|
||||
if (length(TempURN) = 0) then
|
||||
begin
|
||||
AddLogEntry('Invalid URN');
|
||||
exit;
|
||||
end;
|
||||
|
||||
TempErrorMsg := '';
|
||||
|
||||
try
|
||||
try
|
||||
FMediaCS.Acquire;
|
||||
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;
|
||||
if (FSinks <> nil) and
|
||||
(SinksLbx.Items.Count > 0) and
|
||||
(SinksLbx.ItemIndex >= 0) and
|
||||
(SinksLbx.ItemIndex < length(FSinks)) then
|
||||
Chromium1.GetDeviceInfo(FSinks[SinksLbx.ItemIndex].SinkIntf);
|
||||
finally
|
||||
TempSource := nil;
|
||||
FMediaCS.Release;
|
||||
if (length(TempErrorMsg) > 0) then AddLogEntry(TempErrorMsg);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -754,10 +790,12 @@ begin
|
||||
SendMsgBtn.Enabled := TerminateRouteBtn.Enabled and
|
||||
(length(trim(MessageMem.Lines.Text)) > 0);
|
||||
|
||||
GetDeviceInfoBtn.Enabled := (SinksLbx.ItemIndex >= 0) and
|
||||
(SinksLbx.Items.Count > 0);
|
||||
|
||||
CreateRouteBtn.Enabled := not(TerminateRouteBtn.Enabled) and
|
||||
(length(trim(SourceURNCbx.Text)) > 0) and
|
||||
(SinksLbx.ItemIndex >= 0) and
|
||||
(SinksLbx.Items.Count > 0);
|
||||
GetDeviceInfoBtn.Enabled and
|
||||
(length(trim(SourceURNCbx.Text)) > 0);
|
||||
end;
|
||||
|
||||
procedure TMediaRouterFrm.AddLogEntry(const aMessage1, aMessage2 : string; aRec : boolean);
|
||||
|
@ -215,7 +215,8 @@ contains
|
||||
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
|
||||
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
|
||||
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
|
||||
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas';
|
||||
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas',
|
||||
uCEFMediaSinkDeviceInfoCallback in '..\source\uCEFMediaSinkDeviceInfoCallback.pas';
|
||||
|
||||
end.
|
||||
|
||||
|
@ -212,6 +212,7 @@ contains
|
||||
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
|
||||
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
|
||||
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
|
||||
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas';
|
||||
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas',
|
||||
uCEFMediaSinkDeviceInfoCallback in '..\source\uCEFMediaSinkDeviceInfoCallback.pas';
|
||||
|
||||
end.
|
||||
|
@ -220,7 +220,8 @@ contains
|
||||
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
|
||||
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
|
||||
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
|
||||
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas';
|
||||
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas',
|
||||
uCEFMediaSinkDeviceInfoCallback in '..\source\uCEFMediaSinkDeviceInfoCallback.pas';
|
||||
|
||||
end.
|
||||
|
||||
|
@ -336,6 +336,7 @@
|
||||
<DCCReference Include="..\source\uCEFMenuButtonComponent.pas"/>
|
||||
<DCCReference Include="..\source\uCEFAudioHandler.pas"/>
|
||||
<DCCReference Include="..\source\uCEFDevToolsMessageObserver.pas"/>
|
||||
<DCCReference Include="..\source\uCEFMediaSinkDeviceInfoCallback.pas"/>
|
||||
<BuildConfiguration Include="Base">
|
||||
<Key>Base</Key>
|
||||
</BuildConfiguration>
|
||||
|
@ -21,8 +21,8 @@
|
||||
</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."/>
|
||||
<License Value="MPL 1.1"/>
|
||||
<Version Major="83" Minor="4" Release="2"/>
|
||||
<Files Count="187">
|
||||
<Version Major="83" Minor="5"/>
|
||||
<Files Count="188">
|
||||
<Item1>
|
||||
<Filename Value="..\source\uCEFAccessibilityHandler.pas"/>
|
||||
<UnitName Value="uCEFAccessibilityHandler"/>
|
||||
@ -787,6 +787,10 @@
|
||||
<Filename Value="..\source\uCEFDevToolsMessageObserver.pas"/>
|
||||
<UnitName Value="uCEFDevToolsMessageObserver"/>
|
||||
</Item187>
|
||||
<Item188>
|
||||
<Filename Value="..\source\uCEFMediaSinkDeviceInfoCallback.pas"/>
|
||||
<UnitName Value="uCEFMediaSinkDeviceInfoCallback"/>
|
||||
</Item188>
|
||||
</Files>
|
||||
<RequiredPkgs Count="4">
|
||||
<Item1>
|
||||
|
@ -62,7 +62,7 @@ uses
|
||||
uCEFBrowserViewComponent, uCEFWindowComponent, uCEFPanelComponent,
|
||||
uCEFScrollViewComponent, uCEFTextfieldComponent, uCEFViewComponent,
|
||||
uCEFViewsFrameworkEvents, uCEFAudioHandler, uCEFDevToolsMessageObserver,
|
||||
LazarusPackageIntf;
|
||||
uCEFMediaSinkDeviceInfoCallback, LazarusPackageIntf;
|
||||
|
||||
implementation
|
||||
|
||||
|
@ -61,8 +61,8 @@ uses
|
||||
|
||||
const
|
||||
CEF_SUPPORTED_VERSION_MAJOR = 83;
|
||||
CEF_SUPPORTED_VERSION_MINOR = 4;
|
||||
CEF_SUPPORTED_VERSION_RELEASE = 2;
|
||||
CEF_SUPPORTED_VERSION_MINOR = 5;
|
||||
CEF_SUPPORTED_VERSION_RELEASE = 0;
|
||||
CEF_SUPPORTED_VERSION_BUILD = 0;
|
||||
|
||||
CEF_CHROMEELF_VERSION_MAJOR = 83;
|
||||
|
@ -299,6 +299,7 @@ type
|
||||
FOnCookieSet : TOnCookieSet;
|
||||
FOnZoomPctAvailable : TOnZoomPctAvailable;
|
||||
FOnMediaRouteCreateFinished : TOnMediaRouteCreateFinishedEvent;
|
||||
FOnMediaSinkDeviceInfo : TOnMediaSinkDeviceInfoEvent;
|
||||
{$IFDEF MSWINDOWS}
|
||||
FOnBrowserCompMsg : TOnCompMsgEvent;
|
||||
FOnWidgetCompMsg : TOnCompMsgEvent;
|
||||
@ -612,6 +613,7 @@ type
|
||||
procedure doSetZoomPct(const aValue : double); virtual;
|
||||
procedure doSetZoomStep(aValue : byte); 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 MustCreateDevToolsMessageObserver : boolean; virtual;
|
||||
function MustCreateLoadHandler : boolean; virtual;
|
||||
@ -779,6 +781,7 @@ type
|
||||
procedure NotifyCurrentSinks;
|
||||
procedure NotifyCurrentRoutes;
|
||||
procedure CreateRoute(const source: ICefMediaSource; const sink: ICefMediaSink);
|
||||
procedure GetDeviceInfo(const aMediaSink: ICefMediaSink);
|
||||
|
||||
property DefaultUrl : ustring read FDefaultUrl write FDefaultUrl;
|
||||
property Options : TChromiumOptions read FOptions write FOptions;
|
||||
@ -882,6 +885,7 @@ type
|
||||
property OnCookieSet : TOnCookieSet read FOnCookieSet write FOnCookieSet;
|
||||
property OnZoomPctAvailable : TOnZoomPctAvailable read FOnZoomPctAvailable write FOnZoomPctAvailable;
|
||||
property OnMediaRouteCreateFinished : TOnMediaRouteCreateFinishedEvent read FOnMediaRouteCreateFinished write FOnMediaRouteCreateFinished;
|
||||
property OnMediaSinkDeviceInfo : TOnMediaSinkDeviceInfoEvent read FOnMediaSinkDeviceInfo write FOnMediaSinkDeviceInfo;
|
||||
{$IFDEF MSWINDOWS}
|
||||
property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg;
|
||||
property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg;
|
||||
@ -1099,7 +1103,8 @@ uses
|
||||
uCEFStringVisitor, uCEFListValue, uCEFNavigationEntryVisitor,
|
||||
uCEFDownloadImageCallBack, uCEFCookieManager, uCEFRequestContextHandler,
|
||||
uCEFCookieVisitor, uCEFSetCookieCallback, uCEFResourceRequestHandler,
|
||||
uCEFMediaObserver, uCEFMediaRouteCreateCallback ,uCEFDevToolsMessageObserver;
|
||||
uCEFMediaObserver, uCEFMediaRouteCreateCallback ,uCEFDevToolsMessageObserver,
|
||||
uCEFMediaSinkDeviceInfoCallback;
|
||||
|
||||
constructor TChromiumCore.Create(AOwner: TComponent);
|
||||
begin
|
||||
@ -1681,6 +1686,7 @@ begin
|
||||
FOnCookieSet := nil;
|
||||
FOnZoomPctAvailable := nil;
|
||||
FOnMediaRouteCreateFinished := nil;
|
||||
FOnMediaSinkDeviceInfo := nil;
|
||||
|
||||
{$IFDEF MSWINDOWS}
|
||||
FOnBrowserCompMsg := nil;
|
||||
@ -4628,6 +4634,12 @@ begin
|
||||
FOnMediaRouteCreateFinished(self, result, error, route);
|
||||
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;
|
||||
begin
|
||||
Result := assigned(FOnLoadStart) or
|
||||
@ -6424,6 +6436,19 @@ begin
|
||||
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}
|
||||
function TChromiumCore.CopyDCToBitmapStream(aSrcDC : HDC; const aSrcRect : TRect; var aStream : TStream) : boolean;
|
||||
var
|
||||
|
@ -201,6 +201,7 @@ type
|
||||
TOnCookieSet = procedure(Sender: TObject; aSuccess : boolean; aID : integer) 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;
|
||||
TOnMediaSinkDeviceInfoEvent = procedure(Sender: TObject; const ip_address: ustring; port: integer; const model_name: ustring) of object;
|
||||
{$IFDEF MSWINDOWS}
|
||||
TOnCompMsgEvent = procedure(var aMessage: TMessage; var aHandled: Boolean) of object;
|
||||
{$ENDIF}
|
||||
|
@ -149,6 +149,7 @@ type
|
||||
ICefMediaRoute = interface;
|
||||
ICefMediaRouteCreateCallback = interface;
|
||||
ICefMediaSink = interface;
|
||||
ICefMediaSinkDeviceInfoCallback = interface;
|
||||
ICefMediaSource = interface;
|
||||
ICefAudioHandler = interface;
|
||||
ICefDevToolsMessageObserver = interface;
|
||||
@ -248,7 +249,7 @@ type
|
||||
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;
|
||||
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 ************
|
||||
@ -464,6 +465,7 @@ type
|
||||
procedure doSetZoomStep(aValue : byte);
|
||||
procedure doReadZoom;
|
||||
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 MustCreateLoadHandler : boolean;
|
||||
function MustCreateFocusHandler : boolean;
|
||||
@ -1366,18 +1368,25 @@ type
|
||||
procedure OnMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute);
|
||||
end;
|
||||
|
||||
//
|
||||
ICefMediaSinkDeviceInfoCallback = interface(ICefBaseRefCounted)
|
||||
['{633898DD-4169-45D0-ADDD-6E68B3686E0D}']
|
||||
procedure OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring);
|
||||
end;
|
||||
|
||||
// TCefMediaSink
|
||||
// /include/capi/cef_media_router_capi.h (cef_media_sink_t)
|
||||
ICefMediaSink = interface(ICefBaseRefCounted)
|
||||
['{EDA1A4B2-2A4C-42DD-A7DF-901BF93D908D}']
|
||||
function GetId: ustring;
|
||||
function IsValid: boolean;
|
||||
function GetName: ustring;
|
||||
function GetDescription: ustring;
|
||||
function GetIconType: TCefMediaSinkIconType;
|
||||
function IsCastSink: boolean;
|
||||
function IsDialSink: boolean;
|
||||
function IsCompatibleWith(const source: ICefMediaSource): boolean;
|
||||
function GetId: ustring;
|
||||
function IsValid: boolean;
|
||||
function GetName: ustring;
|
||||
function GetDescription: ustring;
|
||||
function GetIconType: TCefMediaSinkIconType;
|
||||
procedure GetDeviceInfo(const callback: ICefMediaSinkDeviceInfoCallback);
|
||||
function IsCastSink: boolean;
|
||||
function IsDialSink: boolean;
|
||||
function IsCompatibleWith(const source: ICefMediaSource): boolean;
|
||||
|
||||
property ID : ustring read GetId;
|
||||
property Name : ustring read GetName;
|
||||
|
@ -180,7 +180,4 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
end.
|
||||
|
@ -54,14 +54,15 @@ uses
|
||||
type
|
||||
TCefMediaSinkRef = class(TCefBaseRefCountedRef, ICefMediaSink)
|
||||
protected
|
||||
function GetId: ustring;
|
||||
function IsValid: boolean;
|
||||
function GetName: ustring;
|
||||
function GetDescription: ustring;
|
||||
function GetIconType: TCefMediaSinkIconType;
|
||||
function IsCastSink: boolean;
|
||||
function IsDialSink: boolean;
|
||||
function IsCompatibleWith(const source: ICefMediaSource): boolean;
|
||||
function GetId: ustring;
|
||||
function IsValid: boolean;
|
||||
function GetName: ustring;
|
||||
function GetDescription: ustring;
|
||||
function GetIconType: TCefMediaSinkIconType;
|
||||
procedure GetDeviceInfo(const callback: ICefMediaSinkDeviceInfoCallback);
|
||||
function IsCastSink: boolean;
|
||||
function IsDialSink: boolean;
|
||||
function IsCompatibleWith(const source: ICefMediaSource): boolean;
|
||||
public
|
||||
class function UnWrap(data: Pointer): ICefMediaSink;
|
||||
end;
|
||||
@ -96,6 +97,11 @@ begin
|
||||
Result := PCefMediaSink(FData)^.get_icon_type(PCefMediaSink(FData));
|
||||
end;
|
||||
|
||||
procedure TCefMediaSinkRef.GetDeviceInfo(const callback: ICefMediaSinkDeviceInfoCallback);
|
||||
begin
|
||||
PCefMediaSink(FData)^.get_device_info(PCefMediaSink(FData), CefGetData(callback));
|
||||
end;
|
||||
|
||||
function TCefMediaSinkRef.IsCastSink: Boolean;
|
||||
begin
|
||||
Result := PCefMediaSink(FData)^.is_cast_sink(PCefMediaSink(FData)) <> 0;
|
||||
|
177
source/uCEFMediaSinkDeviceInfoCallback.pas
Normal file
177
source/uCEFMediaSinkDeviceInfoCallback.pas
Normal 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.
|
@ -246,7 +246,9 @@ type
|
||||
PCefMediaObserver = ^TCefMediaObserver;
|
||||
PCefMediaSink = ^TCefMediaSink;
|
||||
PPCefMediaSink = ^PCefMediaSink;
|
||||
PCefMediaSinkDeviceInfoCallback = ^TCefMediaSinkDeviceInfoCallback;
|
||||
PCefMediaSource = ^TCefMediaSource;
|
||||
PCefMediaSinkDeviceInfo = ^TCefMediaSinkDeviceInfo;
|
||||
|
||||
{$IFDEF LINUX}
|
||||
PXEvent = Pointer;
|
||||
@ -1421,6 +1423,13 @@ type
|
||||
frames_per_buffer : integer;
|
||||
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)
|
||||
TCefBaseRefCounted = record
|
||||
size : NativeUInt;
|
||||
@ -1649,11 +1658,18 @@ type
|
||||
get_name : function(self: PCefMediaSink): PCefStringUserFree; stdcall;
|
||||
get_description : function(self: PCefMediaSink): PCefStringUserFree; 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_dial_sink : function(self: PCefMediaSink): Integer; stdcall;
|
||||
is_compatible_with : function(self: PCefMediaSink; source: PCefMediaSource): Integer; stdcall;
|
||||
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)
|
||||
TCefMediaSource = record
|
||||
base : TCefBaseRefCounted;
|
||||
|
@ -2,9 +2,9 @@
|
||||
"UpdateLazPackages" : [
|
||||
{
|
||||
"ForceNotify" : true,
|
||||
"InternalVersion" : 160,
|
||||
"InternalVersion" : 161,
|
||||
"Name" : "cef4delphi_lazarus.lpk",
|
||||
"Version" : "83.4.2.0"
|
||||
"Version" : "83.5.0.0"
|
||||
}
|
||||
],
|
||||
"UpdatePackageData" : {
|
||||
|
Loading…
x
Reference in New Issue
Block a user