How to implement js calls to C++ in WebBrowser

I haven’t used CEF before. I plan to implement js calling c++ in UE’s WebBrowser. So I referred to some examples and extended FCEFBrowserApp of the engine source code to inherit the CefRenderProcessHandler and CefV8Handler interfaces and override the GetRenderProcessHandler, OnContextCreated, and Execute functions.

class FCEFBrowserApp : public CefApp,
public CefBrowserProcessHandler,
public CefRenderProcessHandler,
public CefV8Handler
{
public:

/**
 * Default Constructor
 */
FCEFBrowserApp();

/** Used to pump the CEF message loop whenever OnScheduleMessagePumpWork is triggered */
bool TickMessagePump(float DeltaTime, bool bForce);
private:
// CefApp methods.
virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler() override 
{
	return this;  //breakpoint can hit
};
virtual void OnBeforeCommandLineProcessing(const CefString& ProcessType, CefRefPtr< CefCommandLine > CommandLine) override;
// CefBrowserProcessHandler methods:
virtual void OnBeforeChildProcessLaunch(CefRefPtr<CefCommandLine> CommandLine) override;
virtual void OnScheduleMessagePumpWork(int64 delay_ms) override;
/////////////////////////////////////////////////////////////////////////////////////////////////
virtual CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler() override 
{
	return this;  //breakpoint can not hit
};
virtual bool Execute(const CefString& func_name, CefRefPtr<CefV8Value> call_obj, const CefV8ValueList& args, CefRefPtr<CefV8Value>& retval, CefString& exception) override
{ 
	return true;
};
virtual void OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,	CefRefPtr<CefV8Context> context) override 
{
	// CefRefPtr<CefV8Value> window = context->GetGlobal();
	// CefRefPtr<CefV8Value> myFunc = CefV8Value::CreateFunction("addFunction", this);
	//window->SetValue("add_Function", myFunc, V8_PROPERTY_ATTRIBUTE_NONE);
	return; //breakpoint can not hit
};
/////////////////////////////////////////////////////////////////////////////////////////////////////
// Include the default reference counting implementation.
IMPLEMENT_REFCOUNTING(FCEFBrowserApp);

// Lock for access MessagePumpCountdown
FCriticalSection MessagePumpCountdownCS;
// Countdown in milliseconds until CefDoMessageLoopWork is called.  Updated by OnScheduleMessagePumpWork

int64 MessagePumpCountdown;};

Then I compiled the source code into a debug version. The webpage can be displayed correctly in the editor, but the newly override three functions are not called (breakpoints are not hit), but the original GetBrowserProcessHandler override function of FCEFBrowserApp is called (breakpoints can be hit).

Then I tried to get CefFrame’s CefV8Context in FCEFBrowserHandler

void FCEFBrowserHandler::OnLoadStart(CefRefPtr<CefBrowser> Browser, CefRefPtr<CefFrame> Frame, TransitionType CefTransitionType)
{
    CefRefPtr<CefV8Context> context1 = Browser->GetMainFrame()->GetV8Context();
    CefRefPtr<CefV8Context> context2 = Frame->GetV8Context();
}

but returned context1 and context2 are null.
Can anyone provide some suggestions for the above problems?
Of course, my goal is to implement js calling c++.
Thanks