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

Improved debug info in JS extension demos

Removed mutation observer from the JSRTTIExtension demo
This commit is contained in:
Salvador Díaz Fau
2019-09-12 11:40:52 +02:00
parent f6973112aa
commit 8b948745ef
9 changed files with 163 additions and 118 deletions

View File

@ -57,6 +57,7 @@ const
MINIBROWSER_CONTEXTMENU_SETJSEVENT = MENU_ID_USER_FIRST + 1; MINIBROWSER_CONTEXTMENU_SETJSEVENT = MENU_ID_USER_FIRST + 1;
MINIBROWSER_CONTEXTMENU_JSVISITDOM = MENU_ID_USER_FIRST + 2; MINIBROWSER_CONTEXTMENU_JSVISITDOM = MENU_ID_USER_FIRST + 2;
MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS = MENU_ID_USER_FIRST + 3;
MOUSEOVER_MESSAGE_NAME = 'mouseover'; MOUSEOVER_MESSAGE_NAME = 'mouseover';
CUSTOMNAME_MESSAGE_NAME = 'customname'; CUSTOMNAME_MESSAGE_NAME = 'customname';
@ -280,6 +281,7 @@ var
TempExtensionCode : string; TempExtensionCode : string;
TempHandler : ICefv8Handler; TempHandler : ICefv8Handler;
begin begin
try
// This is a JS extension example with 2 functions and several parameters. // This is a JS extension example with 2 functions and several parameters.
// Please, read the "JavaScript Integration" wiki page at // Please, read the "JavaScript Integration" wiki page at
// https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration.md // https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration.md
@ -298,9 +300,12 @@ begin
' };' + ' };' +
'})();'; '})();';
try
TempHandler := TTestExtensionHandler.Create; TempHandler := TTestExtensionHandler.Create;
CefRegisterExtension('myextension', TempExtensionCode, TempHandler);
if CefRegisterExtension('myextension', TempExtensionCode, TempHandler) then
{$IFDEF DEBUG}CefDebugLog('JavaScript extension registered successfully!'){$ENDIF}
else
{$IFDEF DEBUG}CefDebugLog('There was an error registering the JavaScript extension!'){$ENDIF};
finally finally
TempHandler := nil; TempHandler := nil;
end; end;
@ -311,8 +316,7 @@ begin
GlobalCEFApp := TCefApplication.Create; GlobalCEFApp := TCefApplication.Create;
GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized; GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized;
GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors';
{$IFDEF DEBUG}
{$IFDEF INTFLOG}
GlobalCEFApp.LogFile := 'debug.log'; GlobalCEFApp.LogFile := 'debug.log';
GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO;
{$ENDIF} {$ENDIF}
@ -343,6 +347,7 @@ begin
model.AddSeparator; model.AddSeparator;
model.AddItem(MINIBROWSER_CONTEXTMENU_SETJSEVENT, 'Set mouseover event'); model.AddItem(MINIBROWSER_CONTEXTMENU_SETJSEVENT, 'Set mouseover event');
model.AddItem(MINIBROWSER_CONTEXTMENU_JSVISITDOM, 'Visit DOM in JavaScript'); model.AddItem(MINIBROWSER_CONTEXTMENU_JSVISITDOM, 'Visit DOM in JavaScript');
model.AddItem(MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS, 'Show DevTools');
end; end;
procedure TJSExtensionFrm.Chromium1BeforePopup(Sender: TObject; procedure TJSExtensionFrm.Chromium1BeforePopup(Sender: TObject;
@ -368,6 +373,9 @@ procedure TJSExtensionFrm.Chromium1ContextMenuCommand(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer; const params: ICefContextMenuParams; commandId: Integer;
eventFlags: Cardinal; out Result: Boolean); eventFlags: Cardinal; out Result: Boolean);
var
TempPoint : TPoint;
TempJSCode : string;
begin begin
Result := False; Result := False;
@ -376,22 +384,34 @@ begin
case commandId of case commandId of
MINIBROWSER_CONTEXTMENU_SETJSEVENT : MINIBROWSER_CONTEXTMENU_SETJSEVENT :
if (browser <> nil) and (browser.MainFrame <> nil) then if (browser <> nil) and (browser.MainFrame <> nil) then
browser.MainFrame.ExecuteJavaScript( begin
'document.body.addEventListener("mouseover", function(evt){'+ TempJSCode := 'document.body.addEventListener("mouseover", function(evt){'+
'function getpath(n){'+ 'function getpath(n){'+
'var ret = "<" + n.nodeName + ">";'+ 'var ret = "<" + n.nodeName + ">";'+
'if (n.parentNode){return getpath(n.parentNode) + ret} else '+ 'if (n.parentNode){return getpath(n.parentNode) + ret} else '+
'return ret'+ 'return ret'+
'};'+ '};'+
'myextension.mouseover(getpath(evt.target))}'+ // This is the call from JavaScript to the extension with DELPHI code in uTestExtensionHandler.pas 'myextension.mouseover(getpath(evt.target))}'+
')', 'about:blank', 0); ')';
browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0);
end;
MINIBROWSER_CONTEXTMENU_JSVISITDOM : MINIBROWSER_CONTEXTMENU_JSVISITDOM :
if (browser <> nil) and (browser.MainFrame <> nil) then if (browser <> nil) and (browser.MainFrame <> nil) then
browser.MainFrame.ExecuteJavaScript( begin
'var testhtml = document.body.innerHTML;' + TempJSCode := 'var testhtml = document.body.innerHTML; ' +
'myextension.sendresulttobrowser(testhtml, ' + quotedstr(CUSTOMNAME_MESSAGE_NAME) + ');', // This is the call from JavaScript to the extension with DELPHI code in uTestExtensionHandler.pas 'myextension.sendresulttobrowser(testhtml, ' + quotedstr(CUSTOMNAME_MESSAGE_NAME) + ');';
'about:blank', 0);
browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0);
end;
MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS :
begin
TempPoint.x := params.XCoord;
TempPoint.y := params.YCoord;
Chromium1.ShowDevTools(TempPoint, nil);
end;
end; end;
end; end;

View File

@ -38,7 +38,7 @@ object JSRTTIExtensionFrm: TJSRTTIExtensionFrm
Margins.Right = 5 Margins.Right = 5
Align = alClient Align = alClient
TabOrder = 0 TabOrder = 0
Text = 'https://www.briskbard.com/forum/' Text = 'https://www.google.com/'
ExplicitHeight = 21 ExplicitHeight = 21
end end
object GoBtn: TButton object GoBtn: TButton
@ -60,7 +60,7 @@ object JSRTTIExtensionFrm: TJSRTTIExtensionFrm
Height = 19 Height = 19
Panels = < Panels = <
item item
Width = 50 Width = 1000
end> end>
end end
object CEFWindowParent1: TCEFWindowParent object CEFWindowParent1: TCEFWindowParent

View File

@ -58,10 +58,10 @@ const
MINIBROWSER_CONTEXTMENU_SETJSEVENT = MENU_ID_USER_FIRST + 1; MINIBROWSER_CONTEXTMENU_SETJSEVENT = MENU_ID_USER_FIRST + 1;
MINIBROWSER_CONTEXTMENU_JSVISITDOM = MENU_ID_USER_FIRST + 2; MINIBROWSER_CONTEXTMENU_JSVISITDOM = MENU_ID_USER_FIRST + 2;
MINIBROWSER_CONTEXTMENU_MUTATIONOBSERVER = MENU_ID_USER_FIRST + 3; MINIBROWSER_CONTEXTMENU_MUTATIONOBSERVER = MENU_ID_USER_FIRST + 3;
MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS = MENU_ID_USER_FIRST + 4;
MOUSEOVER_MESSAGE_NAME = 'mouseover'; MOUSEOVER_MESSAGE_NAME = 'mouseover';
CUSTOMNAME_MESSAGE_NAME = 'customname'; CUSTOMNAME_MESSAGE_NAME = 'customname';
MUTATIONOBSERVER_MESSAGE_NAME = 'mutationobservermsgname';
type type
TJSRTTIExtensionFrm = class(TForm) TJSRTTIExtensionFrm = class(TForm)
@ -162,7 +162,10 @@ begin
{$IFDEF DELPHI14_UP} {$IFDEF DELPHI14_UP}
// Registering the extension. Read this document for more details : // Registering the extension. Read this document for more details :
// https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration.md // https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration.md
TCefRTTIExtension.Register('myextension', TTestExtension); if TCefRTTIExtension.Register('myextension', TTestExtension) then
{$IFDEF DEBUG}CefDebugLog('JavaScript extension registered successfully!'){$ENDIF}
else
{$IFDEF DEBUG}CefDebugLog('There was an error registering the JavaScript extension!'){$ENDIF};
{$ENDIF} {$ENDIF}
end; end;
@ -171,6 +174,10 @@ begin
GlobalCEFApp := TCefApplication.Create; GlobalCEFApp := TCefApplication.Create;
GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized; GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized;
GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors';
{$IFDEF DEBUG}
GlobalCEFApp.LogFile := 'debug.log';
GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO;
{$ENDIF}
end; end;
procedure TJSRTTIExtensionFrm.GoBtnClick(Sender: TObject); procedure TJSRTTIExtensionFrm.GoBtnClick(Sender: TObject);
@ -191,7 +198,7 @@ begin
model.AddSeparator; model.AddSeparator;
model.AddItem(MINIBROWSER_CONTEXTMENU_SETJSEVENT, 'Set mouseover event'); model.AddItem(MINIBROWSER_CONTEXTMENU_SETJSEVENT, 'Set mouseover event');
model.AddItem(MINIBROWSER_CONTEXTMENU_JSVISITDOM, 'Visit DOM in JavaScript'); model.AddItem(MINIBROWSER_CONTEXTMENU_JSVISITDOM, 'Visit DOM in JavaScript');
model.AddItem(MINIBROWSER_CONTEXTMENU_MUTATIONOBSERVER, 'Add mutation observer'); model.AddItem(MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS, 'Show DevTools');
end; end;
procedure TJSRTTIExtensionFrm.Chromium1BeforePopup(Sender: TObject; procedure TJSRTTIExtensionFrm.Chromium1BeforePopup(Sender: TObject;
@ -213,51 +220,46 @@ procedure TJSRTTIExtensionFrm.Chromium1ContextMenuCommand(Sender: TObject;
eventFlags: Cardinal; out Result: Boolean); eventFlags: Cardinal; out Result: Boolean);
const const
ELEMENT_ID = 'keywords'; // ID attribute in the search box at https://www.briskbard.com/forum/ ELEMENT_ID = 'keywords'; // ID attribute in the search box at https://www.briskbard.com/forum/
var
TempPoint : TPoint;
TempJSCode : string;
begin begin
Result := False; Result := False;
// Here is the code executed for each custom context menu entry // Here is the code executed for each custom context menu entry
case commandId of case commandId of
MINIBROWSER_CONTEXTMENU_SETJSEVENT : MINIBROWSER_CONTEXTMENU_SETJSEVENT :
if (browser <> nil) and (browser.MainFrame <> nil) then if (browser <> nil) and (browser.MainFrame <> nil) then
browser.MainFrame.ExecuteJavaScript( begin
'document.body.addEventListener("mouseover", function(evt){'+ TempJSCode := 'document.body.addEventListener("mouseover", function(evt){'+
'function getpath(n){'+ 'function getpath(n){'+
'var ret = "<" + n.nodeName + ">";'+ 'var ret = "<" + n.nodeName + ">"; '+
'if (n.parentNode){return getpath(n.parentNode) + ret} else '+ 'if (n.parentNode){return getpath(n.parentNode) + ret} else '+
'return ret'+ 'return ret'+
'};'+ '}; '+
'myextension.mouseover(getpath(evt.target))}'+ // This is the call from JavaScript to the extension with DELPHI code in uTestExtension.pas 'myextension.mouseover(getpath(evt.target))}'+ // This is the call from JavaScript to the extension with DELPHI code in uTestExtension.pas
')', 'about:blank', 0); ')';
browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0);
end;
MINIBROWSER_CONTEXTMENU_JSVISITDOM : MINIBROWSER_CONTEXTMENU_JSVISITDOM :
if (browser <> nil) and (browser.MainFrame <> nil) then if (browser <> nil) and (browser.MainFrame <> nil) then
browser.MainFrame.ExecuteJavaScript( begin
'var testhtml = document.body.innerHTML;' + // This is the call from JavaScript to the extension with DELPHI code in uTestExtension.pas
'myextension.sendresulttobrowser(testhtml, ' + quotedstr(CUSTOMNAME_MESSAGE_NAME) + ');', // This is the call from JavaScript to the extension with DELPHI code in uTestExtension.pas TempJSCode := 'var testhtml = document.body.innerHTML; ' +
'about:blank', 0); 'myextension.sendresulttobrowser(testhtml, ' + quotedstr(CUSTOMNAME_MESSAGE_NAME) + ');';
MINIBROWSER_CONTEXTMENU_MUTATIONOBSERVER : browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0);
// This MutatioObserver is based on this example https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver end;
// This observer is configured to execute the callback when the attributes in the search box at google.com
// changes its value. The callback calls a JavaScript extension called "myextension.sendresulttobrowser" to send MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS :
// the "value" attribute to Delphi. begin
// Delphi receives the the information in the Chromium1ProcessMessageReceived procedure and shows it in the status bar. TempPoint.x := params.XCoord;
if (browser <> nil) and (browser.MainFrame <> nil) then TempPoint.y := params.YCoord;
browser.MainFrame.ExecuteJavaScript(
'var targetNode = document.getElementById(' + quotedstr(ELEMENT_ID) + ');' + Chromium1.ShowDevTools(TempPoint, nil);
'var config = { attributes: true, childList: false, subtree: false };'+ end;
'var callback = function(mutationsList, observer) {' +
' for(var mutation of mutationsList) {' +
' if (mutation.type == ' + quotedstr('attributes') + ') {' +
' myextension.sendresulttobrowser(document.getElementById(' + quotedstr(ELEMENT_ID) + ').value, ' + quotedstr(MUTATIONOBSERVER_MESSAGE_NAME) + ');' +
' }' +
' }' +
'};' +
'var observer = new MutationObserver(callback);' +
'observer.observe(targetNode, config);',
'about:blank', 0);
end; end;
end; end;
@ -289,12 +291,6 @@ begin
FText := message.ArgumentList.GetString(0); FText := message.ArgumentList.GetString(0);
PostMessage(Handle, MINIBROWSER_SHOWTEXTVIEWER, 0, 0); PostMessage(Handle, MINIBROWSER_SHOWTEXTVIEWER, 0, 0);
Result := True; Result := True;
end
else
if (message.Name = MUTATIONOBSERVER_MESSAGE_NAME) then
begin
StatusBar1.Panels[0].Text := message.ArgumentList.GetString(0);
Result := True;
end; end;
end; end;

View File

@ -22,8 +22,8 @@
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<IsVisibleTab Value="True"/> <IsVisibleTab Value="True"/>
<EditorIndex Value="1"/> <EditorIndex Value="1"/>
<TopLine Value="173"/> <TopLine Value="303"/>
<CursorPos X="17" Y="207"/> <CursorPos X="11" Y="326"/>
<UsageCount Value="20"/> <UsageCount Value="20"/>
<Loaded Value="True"/> <Loaded Value="True"/>
<LoadedDesigner Value="True"/> <LoadedDesigner Value="True"/>
@ -50,7 +50,7 @@
<DefaultSyntaxHighlighter Value="Delphi"/> <DefaultSyntaxHighlighter Value="Delphi"/>
</Unit3> </Unit3>
</Units> </Units>
<JumpHistory Count="22" HistoryIndex="21"> <JumpHistory Count="23" HistoryIndex="22">
<Position1> <Position1>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
</Position1> </Position1>
@ -138,6 +138,10 @@
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="205" Column="75" TopLine="173"/> <Caret Line="205" Column="75" TopLine="173"/>
</Position22> </Position22>
<Position23>
<Filename Value="uJSExtension.pas"/>
<Caret Line="61" Column="30" TopLine="47"/>
</Position23>
</JumpHistory> </JumpHistory>
<RunParams> <RunParams>
<FormatVersion Value="2"/> <FormatVersion Value="2"/>

View File

@ -1,7 +1,7 @@
object JSExtensionFrm: TJSExtensionFrm object JSExtensionFrm: TJSExtensionFrm
Left = 185 Left = 483
Height = 589 Height = 589
Top = 131 Top = 152
Width = 978 Width = 978
Caption = 'JSExtension' Caption = 'JSExtension'
ClientHeight = 589 ClientHeight = 589

View File

@ -59,6 +59,7 @@ const
MINIBROWSER_CONTEXTMENU_SETJSEVENT = MENU_ID_USER_FIRST + 1; MINIBROWSER_CONTEXTMENU_SETJSEVENT = MENU_ID_USER_FIRST + 1;
MINIBROWSER_CONTEXTMENU_JSVISITDOM = MENU_ID_USER_FIRST + 2; MINIBROWSER_CONTEXTMENU_JSVISITDOM = MENU_ID_USER_FIRST + 2;
MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS = MENU_ID_USER_FIRST + 3;
MOUSEOVER_MESSAGE_NAME = 'mouseover'; MOUSEOVER_MESSAGE_NAME = 'mouseover';
CUSTOMNAME_MESSAGE_NAME = 'customname'; CUSTOMNAME_MESSAGE_NAME = 'customname';
@ -304,7 +305,11 @@ begin
try try
TempHandler := TTestExtensionHandler.Create; TempHandler := TTestExtensionHandler.Create;
CefRegisterExtension('myextension', TempExtensionCode, TempHandler);
if CefRegisterExtension('myextension', TempExtensionCode, TempHandler) then
{$IFDEF DEBUG}CefDebugLog('JavaScript extension registered successfully!'){$ENDIF}
else
{$IFDEF DEBUG}CefDebugLog('There was an error registering the JavaScript extension!'){$ENDIF};
finally finally
TempHandler := nil; TempHandler := nil;
end; end;
@ -315,8 +320,7 @@ begin
GlobalCEFApp := TCefApplication.Create; GlobalCEFApp := TCefApplication.Create;
GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized; GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized;
GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors';
{$IFDEF DEBUG}
{$IFDEF INTFLOG}
GlobalCEFApp.LogFile := 'debug.log'; GlobalCEFApp.LogFile := 'debug.log';
GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO;
{$ENDIF} {$ENDIF}
@ -347,6 +351,7 @@ begin
model.AddSeparator; model.AddSeparator;
model.AddItem(MINIBROWSER_CONTEXTMENU_SETJSEVENT, 'Set mouseover event'); model.AddItem(MINIBROWSER_CONTEXTMENU_SETJSEVENT, 'Set mouseover event');
model.AddItem(MINIBROWSER_CONTEXTMENU_JSVISITDOM, 'Visit DOM in JavaScript'); model.AddItem(MINIBROWSER_CONTEXTMENU_JSVISITDOM, 'Visit DOM in JavaScript');
model.AddItem(MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS, 'Show DevTools');
end; end;
procedure TJSExtensionFrm.Chromium1BeforePopup(Sender: TObject; procedure TJSExtensionFrm.Chromium1BeforePopup(Sender: TObject;
@ -374,6 +379,9 @@ procedure TJSExtensionFrm.Chromium1ContextMenuCommand(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer; const params: ICefContextMenuParams; commandId: Integer;
eventFlags: Cardinal; out Result: Boolean); eventFlags: Cardinal; out Result: Boolean);
var
TempPoint : TPoint;
TempJSCode : string;
begin begin
Result := False; Result := False;
@ -382,22 +390,34 @@ begin
case commandId of case commandId of
MINIBROWSER_CONTEXTMENU_SETJSEVENT : MINIBROWSER_CONTEXTMENU_SETJSEVENT :
if (browser <> nil) and (browser.MainFrame <> nil) then if (browser <> nil) and (browser.MainFrame <> nil) then
browser.MainFrame.ExecuteJavaScript( begin
'document.body.addEventListener("mouseover", function(evt){'+ TempJSCode := 'document.body.addEventListener("mouseover", function(evt){'+
'function getpath(n){'+ 'function getpath(n){'+
'var ret = "<" + n.nodeName + ">";'+ 'var ret = "<" + n.nodeName + ">";'+
'if (n.parentNode){return getpath(n.parentNode) + ret} else '+ 'if (n.parentNode){return getpath(n.parentNode) + ret} else '+
'return ret'+ 'return ret'+
'};'+ '};'+
'myextension.mouseover(getpath(evt.target))}'+ // This is the call from JavaScript to the extension with DELPHI code in uTestExtensionHandler.pas 'myextension.mouseover(getpath(evt.target))}'+
')', 'about:blank', 0); ')';
browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0);
end;
MINIBROWSER_CONTEXTMENU_JSVISITDOM : MINIBROWSER_CONTEXTMENU_JSVISITDOM :
if (browser <> nil) and (browser.MainFrame <> nil) then if (browser <> nil) and (browser.MainFrame <> nil) then
browser.MainFrame.ExecuteJavaScript( begin
'var testhtml = document.body.innerHTML;' + TempJSCode := 'var testhtml = document.body.innerHTML; ' +
'myextension.sendresulttobrowser(testhtml, ' + quotedstr(CUSTOMNAME_MESSAGE_NAME) + ');', // This is the call from JavaScript to the extension with DELPHI code in uTestExtensionHandler.pas 'myextension.sendresulttobrowser(testhtml, ' + quotedstr(CUSTOMNAME_MESSAGE_NAME) + ');';
'about:blank', 0);
browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0);
end;
MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS :
begin
TempPoint.x := params.XCoord;
TempPoint.y := params.YCoord;
Chromium1.ShowDevTools(TempPoint, nil);
end;
end; end;
end; end;

View File

@ -378,6 +378,7 @@ var
begin begin
if (GlobalCEFApp <> nil) and if (GlobalCEFApp <> nil) and
GlobalCEFApp.LibLoaded and GlobalCEFApp.LibLoaded and
(GlobalCEFApp.ProcessType = ptRenderer) and
(length(name) > 0) and (length(name) > 0) and
(length(code) > 0) then (length(code) > 0) then
begin begin

View File

@ -92,7 +92,7 @@ type
public public
constructor Create(const value: TValue; SyncMainThread: Boolean = False); reintroduce; constructor Create(const value: TValue; SyncMainThread: Boolean = False); reintroduce;
destructor Destroy; override; destructor Destroy; override;
class procedure Register(const name: ustring; const value: TValue; SyncMainThread: Boolean = False); class function Register(const name: ustring; const value: TValue; SyncMainThread: Boolean = False) : boolean;
end; end;
{$ENDIF} {$ENDIF}
@ -748,17 +748,21 @@ begin
Result := True; Result := True;
end; end;
class procedure TCefRTTIExtension.Register(const name: ustring; const value: TValue; SyncMainThread: Boolean); class function TCefRTTIExtension.Register(const name: ustring; const value: TValue; SyncMainThread: Boolean) : boolean;
var var
TempCode : ustring; TempCode : ustring;
TempHandler : ICefv8Handler; TempHandler : ICefv8Handler;
begin begin
try
TempHandler := TCefRTTIExtension.Create(value, SyncMainThread); TempHandler := TCefRTTIExtension.Create(value, SyncMainThread);
TempCode := format('this.__defineSetter__(''%s'', function(v){native function $s();$s(v)});' + TempCode := format('this.__defineSetter__(''%s'', function(v){native function $s();$s(v)});' +
'this.__defineGetter__(''%0:s'', function(){native function $g();return $g()});', 'this.__defineGetter__(''%0:s'', function(){native function $g();return $g()});',
[name]); [name]);
CefRegisterExtension(name, TempCode, TempHandler); Result := CefRegisterExtension(name, TempCode, TempHandler);
finally
TempHandler := nil;
end;
end; end;
{$IFDEF CPUX64} {$IFDEF CPUX64}

View File

@ -2,7 +2,7 @@
"UpdateLazPackages" : [ "UpdateLazPackages" : [
{ {
"ForceNotify" : true, "ForceNotify" : true,
"InternalVersion" : 27, "InternalVersion" : 28,
"Name" : "cef4delphi_lazarus.lpk", "Name" : "cef4delphi_lazarus.lpk",
"Version" : "76.1.13.0" "Version" : "76.1.13.0"
} }