nim_duilib/ui_components/cef_control/app/client_app_render.cpp

155 lines
4.8 KiB
C++
Raw Normal View History

2019-04-19 17:19:57 +08:00
#include "stdafx.h"
#include "client_app.h"
#include <string>
#include "include/cef_cookie.h"
#include "include/cef_process_message.h"
#include "include/cef_task.h"
#include "include/cef_v8.h"
#include "cef_control/util/util.h"
#include "cef_control/app/js_handler.h"
#include "cef_control/app/ipc_string_define.h"
#include "cef_control/app/cef_js_bridge.h"
namespace nim_comp
2019-04-19 17:19:57 +08:00
{
//////////////////////////////////////////////////////////////////////////////////////////
// CefRenderProcessHandler methods.
void ClientApp::OnRenderThreadCreated(CefRefPtr<CefListValue> extra_info)
{
}
void ClientApp::OnWebKitInitialized()
{
/**
* JavaScript <EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> NimCefWebFunction <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> call <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Web <EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD> native <EFBFBD><EFBFBD> CefV8Handler <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* param[in] functionName Ҫ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD> C++ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* param[in] params <EFBFBD><EFBFBD><EFBFBD>ø÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵIJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> Object<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD> Native <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>תΪ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
* param[in] callback ִ<EFBFBD>и÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ǰ<EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>
* NimCefWebHelper.call('showMessage', { message: 'Hello C++' }, (arguments) => {
* console.log(arguments)
* })
*/
std::string extensionCode = R"(
var NimCefWebInstance = {};
(() => {
NimCefWebInstance.call = (functionName, arg1, arg2) => {
if (typeof arg1 === 'function') {
native function call(functionName, arg1);
return call(functionName, arg1);
} else {
const jsonString = JSON.stringify(arg1);
native function call(functionName, jsonString, arg2);
return call(functionName, jsonString, arg2);
}
};
NimCefWebInstance.register = (functionName, callback) => {
native function register(functionName, callback);
return register(functionName, callback);
};
})();
)";
CefRefPtr<CefJSHandler> handler = new CefJSHandler();
if (!render_js_bridge_.get())
render_js_bridge_.reset(new CefJSBridge);
handler->AttachJSBridge(render_js_bridge_);
CefRegisterExtension("v8/extern", extensionCode, handler);
}
void ClientApp::OnBrowserCreated(CefRefPtr<CefBrowser> browser)
{
if (!render_js_bridge_.get())
render_js_bridge_.reset(new CefJSBridge);
}
void ClientApp::OnBrowserDestroyed(CefRefPtr<CefBrowser> browser)
{
}
CefRefPtr<CefLoadHandler> ClientApp::GetLoadHandler()
{
return NULL;
}
bool ClientApp::OnBeforeNavigation(
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefRequest> request,
NavigationType navigation_type,
bool is_redirect)
{
return false;
}
void ClientApp::OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
{
}
void ClientApp::OnContextReleased(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
{
render_js_bridge_->RemoveCallbackFuncWithFrame(frame);
render_js_bridge_->UnRegisterJSFuncWithFrame(frame);
}
void ClientApp::OnUncaughtException(
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefV8Context> context,
CefRefPtr<CefV8Exception> exception,
CefRefPtr<CefV8StackTrace> stackTrace)
{
}
void ClientApp::OnFocusedNodeChanged(
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefDOMNode> node)
{
bool is_editable = (node.get() && node->IsEditable());
if (is_editable != last_node_is_editable_)
{
// Notify the browser of the change in focused element type.
last_node_is_editable_ = is_editable;
CefRefPtr<CefProcessMessage> message = CefProcessMessage::Create(kFocusedNodeChangedMessage);
message->GetArgumentList()->SetBool(0, is_editable);
browser->SendProcessMessage(PID_BROWSER, message);
}
}
bool ClientApp::OnProcessMessageReceived(
CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message)
{
ASSERT(source_process == PID_BROWSER);
// <20>յ<EFBFBD> browser <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD>ظ<EFBFBD>
const CefString& message_name = message->GetName();
if (message_name == kExecuteJsCallbackMessage)
{
int callback_id = message->GetArgumentList()->GetInt(0);
bool has_error = message->GetArgumentList()->GetBool(1);
CefString json_string = message->GetArgumentList()->GetString(2);
// <20><><EFBFBD>յ<EFBFBD><D5B5>IJ<EFBFBD><C4B2><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ݵĻص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
render_js_bridge_->ExecuteJSCallbackFunc(callback_id, has_error, json_string);
}
else if (message_name == kCallJsFunctionMessage)
{
CefString function_name = message->GetArgumentList()->GetString(0);
CefString json_string = message->GetArgumentList()->GetString(1);
int cpp_callback_id = message->GetArgumentList()->GetInt(2);
int64 frame_id = message->GetArgumentList()->GetInt(3);
// ͨ<><CDA8> C++ ִ<><D6B4>һ<EFBFBD><D2BB><EFBFBD>Ѿ<EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> JS <20><><EFBFBD><EFBFBD>
// frame_id С<><D0A1> 0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> browser <20><><EFBFBD>̵<EFBFBD> browser <20><><EFBFBD><EFBFBD>Ч<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>˱<EFBFBD><CBB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>ͻ<EFBFBD>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> frame ִ<>д<EFBFBD><D0B4><EFBFBD>
render_js_bridge_->ExecuteJSFunc(function_name, json_string, frame_id < 0 ? browser->GetMainFrame() : browser->GetFrame(frame_id), cpp_callback_id);
}
return false;
}
}