From 8ff67ba1cddbfadab6cf71fb6485d58b3ecaf075 Mon Sep 17 00:00:00 2001
From: JackLee <809262979@qq.com>
Date: Sat, 29 Mar 2025 16:44:53 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=B5=8F=E8=A7=88=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app.manifest | 28 -
compatibility.manifest | 46 ++
src/QCefWidget/App/CefViewAppBase.cpp | 73 ---
src/QCefWidget/App/CefViewAppBase.h | 67 ---
src/QCefWidget/App/CefViewOtherApp.cpp | 6 -
src/QCefWidget/App/CefViewOtherApp.h | 22 -
src/QCefWidget/App/CefViewRenderApp.cpp | 208 -------
src/QCefWidget/App/CefViewRenderApp.h | 180 ------
src/QCefWidget/Bridge/CefViewBridgeObject.cpp | 517 ------------------
src/QCefWidget/Bridge/CefViewBridgeObject.h | 221 --------
src/QCefWidget/CefViewWidget.cpp | 128 -----
src/QCefWidget/CefViewWidget.h | 58 --
src/QCefWidget/CefWidget.cpp | 2 +-
src/QCefWidget/CefWidget.h | 2 +-
src/QCefWidget/Common/CefViewCoreLog.cpp | 141 -----
src/QCefWidget/Common/CefViewCoreLog.h | 57 --
src/QCefWidget/Common/CefViewDebug.cpp | 64 ---
src/QCefWidget/Common/CefViewDebug.h | 21 -
src/QCefWidget/DownloadManager.cpp | 52 --
src/QCefWidget/DownloadManager.h | 26 -
src/QCefWidget/MainWindow.cpp | 317 -----------
src/QCefWidget/MainWindow.h | 77 ---
src/QCefWidget/MainWindow.ui | 250 ---------
src/main.cpp | 259 ++++-----
sui.rc | 1 +
25 files changed, 179 insertions(+), 2644 deletions(-)
delete mode 100644 app.manifest
create mode 100644 compatibility.manifest
delete mode 100644 src/QCefWidget/App/CefViewAppBase.cpp
delete mode 100644 src/QCefWidget/App/CefViewAppBase.h
delete mode 100644 src/QCefWidget/App/CefViewOtherApp.cpp
delete mode 100644 src/QCefWidget/App/CefViewOtherApp.h
delete mode 100644 src/QCefWidget/App/CefViewRenderApp.cpp
delete mode 100644 src/QCefWidget/App/CefViewRenderApp.h
delete mode 100644 src/QCefWidget/Bridge/CefViewBridgeObject.cpp
delete mode 100644 src/QCefWidget/Bridge/CefViewBridgeObject.h
delete mode 100644 src/QCefWidget/CefViewWidget.cpp
delete mode 100644 src/QCefWidget/CefViewWidget.h
delete mode 100644 src/QCefWidget/Common/CefViewCoreLog.cpp
delete mode 100644 src/QCefWidget/Common/CefViewCoreLog.h
delete mode 100644 src/QCefWidget/Common/CefViewDebug.cpp
delete mode 100644 src/QCefWidget/Common/CefViewDebug.h
delete mode 100644 src/QCefWidget/DownloadManager.cpp
delete mode 100644 src/QCefWidget/DownloadManager.h
delete mode 100644 src/QCefWidget/MainWindow.cpp
delete mode 100644 src/QCefWidget/MainWindow.h
delete mode 100644 src/QCefWidget/MainWindow.ui
diff --git a/app.manifest b/app.manifest
deleted file mode 100644
index 8356b07..0000000
--- a/app.manifest
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
- ctai
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/compatibility.manifest b/compatibility.manifest
new file mode 100644
index 0000000..dc4ae16
--- /dev/null
+++ b/compatibility.manifest
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/QCefWidget/App/CefViewAppBase.cpp b/src/QCefWidget/App/CefViewAppBase.cpp
deleted file mode 100644
index ee54901..0000000
--- a/src/QCefWidget/App/CefViewAppBase.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-#include "CefViewAppBase.h"
-
-#include "../Common/CefViewCoreLog.h"
-#include
-
-// These flags must match the Chromium values.
-const char kProcessType[] = "type";
-const char kZygoteProcess[] = "zygote";
-const char kRendererProcess[] = "renderer";
-
-CefViewAppBase::CefViewAppBase(const CefString& scheme_name)
- : builtin_scheme_name_(scheme_name)
-{
-}
-
-// static
-CefViewAppBase::ProcessType
-CefViewAppBase::GetProcessType(CefRefPtr command_line)
-{
- // The command-line flag won't be specified for the browser process.
- if (!command_line->HasSwitch(kProcessType))
- return UnkownProcess;
-
- auto process_type = command_line->GetSwitchValue(kProcessType);
- logI("process type parameter is: %s", process_type.c_str());
- if (process_type == kZygoteProcess) {
- // for linux only
- return ZygoteProcess;
- } else if (process_type == kRendererProcess) {
- return RendererProcess;
- }
-
- return OtherProcess;
-}
-
-CefString
-CefViewAppBase::GetBridgeObjectName(CefRefPtr command_line)
-{
- if (!command_line->HasSwitch(kCefViewBridgeObjectNameKey))
- return "";
-
- auto name = command_line->GetSwitchValue(kCefViewBridgeObjectNameKey);
- logI("bridge object name: %s", name.c_str());
- return name;
-}
-
-CefString
-CefViewAppBase::GetBuiltinSchemeName(CefRefPtr command_line)
-{
- if (!command_line->HasSwitch(kCefViewBuiltinSchemeNameKey))
- return "";
-
- auto name = command_line->GetSwitchValue(kCefViewBuiltinSchemeNameKey);
- logI("built-in scheme name: %s", name.c_str());
- return name;
-}
-
-void
-CefViewAppBase::OnRegisterCustomSchemes(CefRawPtr registrar)
-{
- if (registrar) {
- int options = 0 //
- | CEF_SCHEME_OPTION_STANDARD //
- | CEF_SCHEME_OPTION_SECURE //
- | CEF_SCHEME_OPTION_CORS_ENABLED //
- | CEF_SCHEME_OPTION_FETCH_ENABLED //
- | 0;
- auto scheme = builtin_scheme_name_.empty() ? kCefViewDefaultBuiltinSchemaName : builtin_scheme_name_;
- if (!registrar->AddCustomScheme(scheme, options)) {
- logE("faield to add built-in scheme: %s", scheme.c_str());
- }
- }
-}
diff --git a/src/QCefWidget/App/CefViewAppBase.h b/src/QCefWidget/App/CefViewAppBase.h
deleted file mode 100644
index 1702ab0..0000000
--- a/src/QCefWidget/App/CefViewAppBase.h
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-// CefWingAppBase.hpp
-// CefViewWing
-//
-// Created by Sheen Tian on 2020/6/17.
-//
-
-#ifndef CefAppBase_h
-#define CefAppBase_h
-
-#pragma region stl_headers
-#include
-#include
-#pragma endregion
-
-#pragma region cef_headers
-#include
-#pragma endregion
-
-class CefViewAppBase : public CefApp
-{
- ///
- ///
- ///
- CefString builtin_scheme_name_;
-
-public:
- CefViewAppBase(const CefString& scheme_name);
-
- enum ProcessType
- {
- UnkownProcess,
- ZygoteProcess,
- RendererProcess,
- OtherProcess,
- };
-
- ///
- /// Gets the current process type
- ///
- /// The command line
- /// The process type
- static ProcessType GetProcessType(CefRefPtr command_line);
-
- ///
- /// Gets the bridge object name from command line
- ///
- /// The command line
- /// The bridge object name
- static CefString GetBridgeObjectName(CefRefPtr command_line);
-
- ///
- /// Gets the built-in scheme name
- ///
- /// The command line
- /// The built-in scheme name
- static CefString GetBuiltinSchemeName(CefRefPtr command_line);
-
-private:
- ///
- ///
- ///
- ///
- virtual void OnRegisterCustomSchemes(CefRawPtr registrar) override;
-};
-
-#endif
diff --git a/src/QCefWidget/App/CefViewOtherApp.cpp b/src/QCefWidget/App/CefViewOtherApp.cpp
deleted file mode 100644
index 740ed18..0000000
--- a/src/QCefWidget/App/CefViewOtherApp.cpp
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "CefViewOtherApp.h"
-
-CefViewOtherApp::CefViewOtherApp(const CefString& scheme_name)
- : CefViewAppBase(scheme_name)
-{
-}
diff --git a/src/QCefWidget/App/CefViewOtherApp.h b/src/QCefWidget/App/CefViewOtherApp.h
deleted file mode 100644
index 33a96f0..0000000
--- a/src/QCefWidget/App/CefViewOtherApp.h
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// CefOtherApp.hpp
-// CefViewWing
-//
-// Created by Sheen Tian on 2020/6/17.
-//
-
-#ifndef CefOtherApp_h
-#define CefOtherApp_h
-#pragma once
-
-#include "CefViewAppBase.h"
-
-class CefViewOtherApp : public CefViewAppBase
-{
- IMPLEMENT_REFCOUNTING(CefViewOtherApp);
-
-public:
- CefViewOtherApp(const CefString& scheme_name);
-};
-
-#endif
diff --git a/src/QCefWidget/App/CefViewRenderApp.cpp b/src/QCefWidget/App/CefViewRenderApp.cpp
deleted file mode 100644
index 541ad3a..0000000
--- a/src/QCefWidget/App/CefViewRenderApp.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-#include "CefViewRenderApp.h"
-
-#pragma region cef_headers
-#include
-#include
-#include
-#pragma endregion
-
-#include "../Common/CefViewCoreLog.h"
-
-#include
-
-CefViewRenderApp::CefViewRenderApp(const CefString& scheme_name, const CefString& bridge_name)
- : CefViewAppBase(scheme_name)
- , bridge_object_name_(bridge_name)
- , last_node_is_editable_(false)
-{
-}
-
-CefViewRenderApp::~CefViewRenderApp() {}
-
-//////////////////////////////////////////////////////////////////////////
-CefRefPtr
-CefViewRenderApp::GetRenderProcessHandler()
-{
- return this;
-}
-
-void
-CefViewRenderApp::OnWebKitInitialized()
-{
- CEF_REQUIRE_RENDERER_THREAD();
-
- CefMessageRouterConfig config;
- config.js_query_function = kCefViewQueryFuntionName;
- config.js_cancel_function = kCefViewQueryCancelFunctionName;
- message_router_ = CefMessageRouterRendererSide::Create(config);
-}
-
-void
-CefViewRenderApp::OnBrowserCreated(CefRefPtr browser, CefRefPtr extra_info)
-{
- CEF_REQUIRE_RENDERER_THREAD();
-}
-
-void
-CefViewRenderApp::OnBrowserDestroyed(CefRefPtr browser)
-{
- CEF_REQUIRE_RENDERER_THREAD();
-}
-
-CefRefPtr
-CefViewRenderApp::GetLoadHandler()
-{
- CEF_REQUIRE_RENDERER_THREAD();
-
- return nullptr;
-}
-
-void
-CefViewRenderApp::OnContextCreated(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr context)
-{
- CEF_REQUIRE_RENDERER_THREAD();
-
- // [Javascript Context]
- // V8 context for this frame has been initialized already,
- // but the script of the page hasn't been executed now
- message_router_->OnContextCreated(browser, frame, context);
-
- // log this event
- frame->ExecuteJavaScript("console.info('[JSRuntime]:frame context created')", frame->GetURL(), 0);
-
- // binding bridge object and functions
- auto frameId = frame->GetIdentifier();
- auto it = frame_id_to_bridge_obj_map_.find(frameId);
- if (it == frame_id_to_bridge_obj_map_.end()) {
- // create and insert the bridge Object into this frame.window object
- CefRefPtr objWindow = context->GetGlobal();
- CefRefPtr objClient = new CefViewBridgeObject(browser, frame, objWindow, bridge_object_name_);
- if (!objClient) {
- log_error("Failed to create the client object");
- return;
- }
- frame_id_to_bridge_obj_map_[frameId] = objClient;
- }
-}
-
-void
-CefViewRenderApp::OnContextReleased(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr context)
-{
- CEF_REQUIRE_RENDERER_THREAD();
-
- message_router_->OnContextReleased(browser, frame, context);
-
- auto frameId = frame->GetIdentifier();
- auto it = frame_id_to_bridge_obj_map_.find(frameId);
- if (it != frame_id_to_bridge_obj_map_.end()) {
- frame_id_to_bridge_obj_map_.erase(it);
- }
-}
-
-void
-CefViewRenderApp::OnUncaughtException(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr context,
- CefRefPtr exception,
- CefRefPtr stackTrace)
-{
- CEF_REQUIRE_RENDERER_THREAD();
-}
-
-void
-CefViewRenderApp::OnFocusedNodeChanged(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr node)
-{
- CEF_REQUIRE_RENDERER_THREAD();
-
- 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 message = CefProcessMessage::Create(kCefViewClientRenderFocusedNodeChangedMessage);
- message->GetArgumentList()->SetBool(0, is_editable);
- frame->SendProcessMessage(PID_BROWSER, message);
- }
-}
-
-bool
-CefViewRenderApp::OnProcessMessageReceived(CefRefPtr browser,
- CefRefPtr frame,
- CefProcessId source_process,
- CefRefPtr message)
-{
- CEF_REQUIRE_RENDERER_THREAD();
-
- bool handled = false;
-
- if (message_router_->OnProcessMessageReceived(browser, frame, source_process, message)) {
- handled = true;
- }
-
- if (OnTriggerEventNotifyMessage(browser, frame, source_process, message)) {
- handled = true;
- }
-
- return handled;
-}
-
-bool
-CefViewRenderApp::OnTriggerEventNotifyMessage(CefRefPtr browser,
- CefRefPtr frame,
- CefProcessId source_process,
- CefRefPtr message)
-{
- if (message->GetName() == kCefViewClientBrowserTriggerEventMessage) {
- CefRefPtr args = message->GetArgumentList()->Copy();
- //** arguments(CefValueList)
- //** +------------+
- //** | event name |
- //** | event arg1 |
- //** | event arg2 |
- //** | event arg3 |
- //** | event arg4 |
- //** | ... |
- //** | ... |
- //** | ... |
- //** | ... |
- //** +------------+
- if (!args || args->GetSize() <= 0) {
- log_error("Invalid message arguments, event name is required");
- return true;
- }
-
- if (CefValueType::VTYPE_STRING != args->GetType(0)) {
- log_error("Invalid message arguments, invalid type for event name");
- return true;
- }
-
- auto name = args->GetString(0);
- args->Remove(0);
- ExecuteEventListener(browser, frame, name, args);
-
- return true;
- }
-
- return false;
-}
-
-void
-CefViewRenderApp::ExecuteEventListener(CefRefPtr browser,
- CefRefPtr frame,
- const CefString& name,
- CefRefPtr args)
-{
- if (browser && frame) {
- auto frameId = frame->GetIdentifier();
- auto it = frame_id_to_bridge_obj_map_.find(frameId);
- if (it != frame_id_to_bridge_obj_map_.end()) {
- const CefRefPtr& objClient = it->second;
- objClient->ExecuteEventListener(name, args);
- }
- }
-}
diff --git a/src/QCefWidget/App/CefViewRenderApp.h b/src/QCefWidget/App/CefViewRenderApp.h
deleted file mode 100644
index fec6c27..0000000
--- a/src/QCefWidget/App/CefViewRenderApp.h
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef CefRenderApp_h
-#define CefRenderApp_h
-#pragma once
-
-#pragma region stl_headers
-#include
-#pragma endregion
-
-#pragma region cef_headers
-#include
-#pragma endregion
-
-#include
-
-#include "CefViewAppBase.h"
-#include "../Bridge/CefViewBridgeObject.h"
-
-///
-///
-///
-class CefViewRenderApp
- : public CefViewAppBase
- , public CefRenderProcessHandler
-{
- // Include the default reference counting implementation.
- IMPLEMENT_REFCOUNTING(CefViewRenderApp);
-
-private:
- CefString bridge_object_name_;
-
- ///
- ///
- ///
- CefRefPtr message_router_;
-
- ///
- ///
- ///
- typedef std::unordered_map> FrameID2BridgeObjMap;
- FrameID2BridgeObjMap frame_id_to_bridge_obj_map_;
-
- ///
- ///
- ///
- bool last_node_is_editable_;
-
-public:
- ///
- ///
- ///
- CefViewRenderApp(const CefString& scheme_name, const CefString& bridge_name);
-
- ///
- ///
- ///
- ~CefViewRenderApp();
-
-private:
-#pragma region CefApp
- ///
- ///
- ///
- ///
- virtual CefRefPtr GetRenderProcessHandler() override;
-
-#pragma endregion
-
-#pragma region CefRenderProcessHandler
-
- ///
- ///
- ///
- virtual void OnWebKitInitialized() override;
-
- ///
- ///
- ///
- ///
- ///
- virtual void OnBrowserCreated(CefRefPtr browser, CefRefPtr extra_info) override;
-
- ///
- ///
- ///
- ///
- virtual void OnBrowserDestroyed(CefRefPtr browser) override;
-
- ///
- ///
- ///
- ///
- virtual CefRefPtr GetLoadHandler() override;
-
- ///
- ///
- ///
- ///
- ///
- ///
- virtual void OnContextCreated(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr context) override;
-
- ///
- ///
- ///
- ///
- ///
- ///
- virtual void OnContextReleased(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr context) override;
-
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- virtual void OnUncaughtException(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr context,
- CefRefPtr exception,
- CefRefPtr stackTrace) override;
-
- ///
- ///
- ///
- ///
- ///
- ///
- virtual void OnFocusedNodeChanged(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr node) override;
-
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- virtual bool OnProcessMessageReceived(CefRefPtr browser,
- CefRefPtr frame,
- CefProcessId source_process,
- CefRefPtr message) override;
-
-#pragma endregion
-
-private:
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- bool OnTriggerEventNotifyMessage(CefRefPtr browser,
- CefRefPtr frame,
- CefProcessId source_process,
- CefRefPtr message);
-
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- void ExecuteEventListener(CefRefPtr browser,
- CefRefPtr frame,
- const CefString& name,
- CefRefPtr args);
-};
-
-#endif
diff --git a/src/QCefWidget/Bridge/CefViewBridgeObject.cpp b/src/QCefWidget/Bridge/CefViewBridgeObject.cpp
deleted file mode 100644
index 19839a7..0000000
--- a/src/QCefWidget/Bridge/CefViewBridgeObject.cpp
+++ /dev/null
@@ -1,517 +0,0 @@
-#include "CefViewBridgeObject.h"
-
-#include
-
-#include "../Common/CefViewCoreLog.h"
-#include
-
-
-#if CEF_VERSION_MAJOR >= 119
-class CefViewArrayBuffer : public CefV8ArrayBufferReleaseCallback
-{
- IMPLEMENT_REFCOUNTING(CefViewArrayBuffer);
- DISALLOW_COPY_AND_ASSIGN(CefViewArrayBuffer);
-
-public:
- ///
- ///
- ///
- ///
- CefViewArrayBuffer(CefBinaryValue* v)
- : m_size(0)
- , m_buffer(nullptr)
- {
- if (v) {
- auto l = v->GetSize();
- if (l) {
- m_buffer = std::make_unique(l);
- v->GetData(m_buffer.get(), l, 0);
- m_size = l;
- }
- }
- }
-
- ///
- ///
- ///
- ~CefViewArrayBuffer()
- {
- m_buffer.reset();
- m_size = 0;
- }
-
- ///
- ///
- ///
- ///
- void* GetBuffer()
- {
- // get under layer buffer address
- return m_buffer.get();
- }
-
- ///
- ///
- ///
- ///
- size_t GetSize()
- {
- // return size
- return m_size;
- }
-
- ///
- ///
- ///
- ///
- void ReleaseBuffer(void* buffer) override
- {
- // release under layer buffer
- m_buffer.reset();
- m_size = 0;
- }
-
-private:
- size_t m_size;
- std::unique_ptr m_buffer;
-};
-#endif
-
-CefViewBridgeObject::V8Handler::V8Handler(CefViewBridgeObject* object)
- : object_(object)
-{
-}
-
-bool
-CefViewBridgeObject::V8Handler::Execute(const CefString& function,
- CefRefPtr object,
- const CefV8ValueList& arguments,
- CefRefPtr& retval,
- CefString& exception)
-{
- if (function == kCefViewInvokeMethodFunctionName)
- ExecuteNativeMethod(object, arguments, retval, exception);
- else if (function == kCefViewAddEventListenerFunctionName)
- ExecuteAddEventListener(object, arguments, retval, exception);
- else if (function == kCefViewRemoveEventListenerFunctionName)
- ExecuteRemoveEventListener(object, arguments, retval, exception);
- else if (function == kCefViewReportJSResultFunctionName)
- ExecuteReportJSResult(object, arguments, retval, exception);
- else
- return false;
-
- return true;
-}
-
-void
-CefViewBridgeObject::V8Handler::ExecuteNativeMethod(CefRefPtr object,
- const CefV8ValueList& arguments,
- CefRefPtr& retval,
- CefString& exception)
-{
- object_->AsyncExecuteNativeMethod(arguments);
- retval = CefV8Value::CreateUndefined();
-}
-
-void
-CefViewBridgeObject::V8Handler::ExecuteAddEventListener(CefRefPtr object,
- const CefV8ValueList& arguments,
- CefRefPtr& retval,
- CefString& exception)
-{
- bool bRet = false;
-
- if (arguments.size() == 2) {
- if (arguments[0]->IsString()) {
- if (arguments[1]->IsFunction()) {
- CefString eventName = arguments[0]->GetStringValue();
- EventListener listener;
- listener.callback_ = arguments[1];
- listener.context_ = CefV8Context::GetCurrentContext();
- object_->AddEventListener(eventName, listener);
- bRet = true;
- } else
- exception = "Invalid arguments; argument 2 must be a function";
- } else
- exception = "Invalid arguments; argument 1 must be a string";
- } else
- exception = "Invalid arguments; expecting 2 arguments";
-
- retval = CefV8Value::CreateBool(bRet);
-}
-
-void
-CefViewBridgeObject::V8Handler::ExecuteRemoveEventListener(CefRefPtr object,
- const CefV8ValueList& arguments,
- CefRefPtr& retval,
- CefString& exception)
-{
- bool bRet = false;
-
- if (arguments.size() == 2) {
- if (arguments[0]->IsString()) {
- if (arguments[1]->IsFunction()) {
- CefString eventName = arguments[0]->GetStringValue();
- EventListener listener;
- listener.callback_ = arguments[1];
- listener.context_ = CefV8Context::GetCurrentContext();
- object_->RemoveEventListener(eventName, listener);
- bRet = true;
- } else
- exception = "Invalid arguments; argument 2 must be a function";
- } else
- exception = "Invalid arguments; argument 1 must be a string";
- } else
- exception = "Invalid arguments; expecting 2 arguments";
-
- retval = CefV8Value::CreateBool(bRet);
-}
-
-void
-CefViewBridgeObject::V8Handler::ExecuteReportJSResult(CefRefPtr object,
- const CefV8ValueList& arguments,
- CefRefPtr& retval,
- CefString& exception)
-{
- if (arguments.size() == 2) {
- if (arguments[0]->IsString()) {
- object_->AsyncExecuteReportJSResult(arguments);
- } else
- exception = "Invalid argument; argument 1 must be a double";
- } else
- exception = "Invalid argument; expecting 2 argument";
-
- retval = CefV8Value::CreateUndefined();
-}
-
-//////////////////////////////////////////////////////////////////////////
-
-CefViewBridgeObject::CefViewBridgeObject(CefRefPtr browser,
- CefRefPtr frame,
- CefRefPtr global,
- const CefString& name)
- : name_(name.empty() ? kCefViewDefaultBridgeObjectName : name)
- , bridgeObject_(nullptr)
- , reportJSResultFunction_(nullptr)
- , browser_(browser)
- , frame_(frame)
- , v8Handler_(new V8Handler(this))
-{
- // create bridge object and mount it on the global context(window)
- bridgeObject_ = CefV8Value::CreateObject(nullptr, nullptr);
-
- // create function "invokeMethod"
- CefRefPtr funcInvokeMethod = CefV8Value::CreateFunction(kCefViewInvokeMethodFunctionName, v8Handler_);
- // add this function to window object
- bridgeObject_->SetValue(kCefViewInvokeMethodFunctionName,
- funcInvokeMethod,
- static_cast(V8_PROPERTY_ATTRIBUTE_READONLY |
- V8_PROPERTY_ATTRIBUTE_DONTENUM |
- V8_PROPERTY_ATTRIBUTE_DONTDELETE));
-
- // create function addEventListener
- CefRefPtr funcAddEventListener =
- CefV8Value::CreateFunction(kCefViewAddEventListenerFunctionName, v8Handler_);
- // add this function to window object
- bridgeObject_->SetValue(kCefViewAddEventListenerFunctionName,
- funcAddEventListener,
- static_cast(V8_PROPERTY_ATTRIBUTE_READONLY |
- V8_PROPERTY_ATTRIBUTE_DONTENUM |
- V8_PROPERTY_ATTRIBUTE_DONTDELETE));
-
- // create function removeListener
- CefRefPtr funcRemoveEventListener =
- CefV8Value::CreateFunction(kCefViewRemoveEventListenerFunctionName, v8Handler_);
- // add this function to window object
- bridgeObject_->SetValue(kCefViewRemoveEventListenerFunctionName,
- funcRemoveEventListener,
- static_cast(V8_PROPERTY_ATTRIBUTE_READONLY |
- V8_PROPERTY_ATTRIBUTE_DONTENUM |
- V8_PROPERTY_ATTRIBUTE_DONTDELETE));
-
- // mount the client object to the global context(usually the window object)
- global->SetValue(name_,
- bridgeObject_,
- static_cast(V8_PROPERTY_ATTRIBUTE_READONLY |
- V8_PROPERTY_ATTRIBUTE_DONTENUM |
- V8_PROPERTY_ATTRIBUTE_DONTDELETE));
- frame_->ExecuteJavaScript("console.info('[JSRuntime]:window." + name_.ToString() + " [object] created');", frame_->GetURL(), 0);
-
- // create "__cefview_report_js_result__" function and mount it on the global context(window)
- reportJSResultFunction_ = CefV8Value::CreateFunction(kCefViewReportJSResultFunctionName, v8Handler_);
- global->SetValue(kCefViewReportJSResultFunctionName,
- reportJSResultFunction_,
- static_cast(V8_PROPERTY_ATTRIBUTE_READONLY |
- V8_PROPERTY_ATTRIBUTE_DONTENUM |
- V8_PROPERTY_ATTRIBUTE_DONTDELETE));
- frame_->ExecuteJavaScript("console.info('[JSRuntime]:window." kCefViewReportJSResultFunctionName
- " [function] created');",
- frame_->GetURL(),
- 0);
-}
-
-CefRefPtr
-CefViewBridgeObject::CefValueToV8Value(CefValue* cefValue)
-{
- CefRefPtr v8Value = CefV8Value::CreateNull();
- if (!cefValue) {
- return v8Value;
- }
-
- auto type = cefValue->GetType();
- switch (type) {
- case CefValueType::VTYPE_INVALID: {
- v8Value = CefV8Value::CreateUndefined();
- } break;
- case CefValueType::VTYPE_NULL: {
- v8Value = CefV8Value::CreateNull();
- } break;
- case CefValueType::VTYPE_BOOL: {
- auto v = cefValue->GetBool();
- v8Value = CefV8Value::CreateBool(v);
- } break;
- case CefValueType::VTYPE_INT: {
- auto v = cefValue->GetInt();
- v8Value = CefV8Value::CreateInt(v);
- } break;
- case CefValueType::VTYPE_DOUBLE: {
- auto v = cefValue->GetDouble();
- v8Value = CefV8Value::CreateDouble(v);
- } break;
- case CefValueType::VTYPE_STRING: {
- auto v = cefValue->GetString();
- v8Value = CefV8Value::CreateString(v);
- } break;
- case CefValueType::VTYPE_BINARY: {
-#if CEF_VERSION_MAJOR >= 119
- auto v = cefValue->GetBinary();
- auto arryBuffer = new CefViewArrayBuffer(v.get());
- v8Value = CefV8Value::CreateArrayBuffer(arryBuffer->GetBuffer(), arryBuffer->GetSize(), arryBuffer);
-#else
- // currently not supported
-#endif
- } break;
- case CefValueType::VTYPE_DICTIONARY: {
- auto cDict = cefValue->GetDictionary();
- CefDictionaryValue::KeyList cKeys;
- cDict->GetKeys(cKeys);
- v8Value = CefV8Value::CreateObject(nullptr, nullptr);
- for (auto& key : cKeys) {
- auto cVal = cDict->GetValue(key);
- auto v8Val = CefValueToV8Value(cVal.get());
- v8Value->SetValue(key, v8Val.get(), V8_PROPERTY_ATTRIBUTE_NONE);
- }
- } break;
- case CefValueType::VTYPE_LIST: {
- auto cList = cefValue->GetList();
- int cCount = static_cast(cList->GetSize());
- v8Value = CefV8Value::CreateArray(static_cast(cCount));
- for (int i = 0; i < cCount; i++) {
- auto cVal = cList->GetValue(i);
- auto v8Val = CefValueToV8Value(cVal.get());
- v8Value->SetValue(i, v8Val.get());
- }
- } break;
- default:
- break;
- }
-
- return v8Value;
-}
-
-CefRefPtr
-CefViewBridgeObject::V8ValueToCefValue(CefV8Value* v8Value)
-{
- CefRefPtr cefValue = CefValue::Create();
- if (!v8Value) {
- return cefValue;
- }
-
- /**
- * The IsDouble, IsInt and IsUint methods return a boolean value indicating whether the CefV8Value instance is an
- * target type or can be converted to the target type.If the value can be converted to the target type, the methods
- * will attempt to do so and return true. If the value is not the target type or cannot be converted to the target
- * type, the method will return false.
- *
- * For example the code below:
- * auto v = CefV8Value::CreateInt(1000);
- * auto isDouble = v->IsDouble();
- * logD("isDouble: %d", isDouble); // true
- * auto isUnint = v->IsUInt();
- * logD("isUnint: %d", isUnint); // true
- * auto isInt = v->IsInt();
- * logD("isInt: %d", isInt); // true
- *
- * auto v = CefV8Value::CreateDouble(0.1);
- * auto isDouble = v->IsDouble();
- * logD("isDouble: %d", isDouble); // true
- * auto isUnint = v->IsUInt();
- * logD("isUnint: %d", isUnint); // false
- * auto isInt = v->IsInt();
- * logD("isInt: %d", isInt); // false
- *
- * so we need to keep the testing order, IsInt/IsUint - IsDouble
- * since there is no Uint type in JavaScript, we just ignore it.
- * Please refer to this test souce:
- * https://github.com/svn2github/cef/blob/master/tests/cefclient/binding_test.cpp
- */
- if (v8Value->IsNull() || v8Value->IsUndefined())
- cefValue->SetNull();
- else if (v8Value->IsBool())
- cefValue->SetBool(v8Value->GetBoolValue());
- else if (v8Value->IsInt())
- cefValue->SetInt(v8Value->GetIntValue());
- else if (v8Value->IsDouble())
- cefValue->SetDouble(v8Value->GetDoubleValue());
- else if (v8Value->IsString())
- cefValue->SetString(v8Value->GetStringValue());
- else if (v8Value->IsArrayBuffer()) {
-#if CEF_VERSION_MAJOR >= 119
- auto size = v8Value->GetArrayBufferByteLength();
- auto data = v8Value->GetArrayBufferData();
- cefValue->SetBinary(CefBinaryValue::Create(data, size));
-#else
- // currently not supported
-#endif
- } else if (v8Value->IsArray()) {
- auto s = v8Value->GetArrayLength();
- auto cefList = CefListValue::Create();
- for (int i = 0; i < s; i++) {
- auto v8Val = v8Value->GetValue(i);
- auto cefVal = V8ValueToCefValue(v8Val.get());
- cefList->SetValue(i, cefVal);
- }
- cefValue->SetList(cefList);
- } else if (v8Value->IsObject()) {
- CefDictionaryValue::KeyList keys;
- v8Value->GetKeys(keys);
- auto cefDict = CefDictionaryValue::Create();
- for (auto& key : keys) {
- auto v8Val = v8Value->GetValue(key);
- auto cefVal = V8ValueToCefValue(v8Val.get());
- cefDict->SetValue(key, cefVal.get());
- }
- cefValue->SetDictionary(cefDict);
- } else
- cefValue->SetNull();
-
- return cefValue;
-}
-
-void
-CefViewBridgeObject::AsyncExecuteNativeMethod(const CefV8ValueList& arguments)
-{
- CefRefPtr msg = CefProcessMessage::Create(kCefViewClientRenderInvokeMethodMessage);
-
- //** arguments(CefValueList)
- //** +-------+
- //** |0 name | <- the method name
- //** |1 arg1 |
- //** |2 arg2 |
- //** |3 arg3 |
- //** |4 arg4 |
- //** | ... |
- //** | ... |
- //** | ... |
- //** | ... |
- //** +-------+
- CefRefPtr args = msg->GetArgumentList();
-
- // push back all the arguments
- for (std::size_t i = 0; i < arguments.size(); i++) {
- auto cefValue = V8ValueToCefValue(arguments[i].get());
- args->SetValue(i, cefValue);
- }
-
- // send the message
- if (browser_)
- frame_->SendProcessMessage(PID_BROWSER, msg);
-}
-
-void
-CefViewBridgeObject::AsyncExecuteReportJSResult(const CefV8ValueList& arguments)
-{
- CefRefPtr msg = CefProcessMessage::Create(kCefViewClientRenderReportJSResultMessage);
-
- //** arguments(CefValueList)
- //** +_------+
- //** |0 arg | <- the context (string)
- //** |1 arg | <- the result value
- //** +-------+
- CefRefPtr args = msg->GetArgumentList();
-
- // push back the result value
- for (std::size_t i = 0; i < arguments.size(); i++) {
- auto cefValue = V8ValueToCefValue(arguments[i].get());
- args->SetValue(i, cefValue.get());
- }
-
- // send the message
- if (browser_)
- frame_->SendProcessMessage(PID_BROWSER, msg);
-}
-
-void
-CefViewBridgeObject::AddEventListener(const CefString& name, const EventListener& listener)
-{
- auto itListenerList = eventListenerListMap_.find(name);
- if (itListenerList == eventListenerListMap_.end()) {
- EventListenerList eventListenerList;
- eventListenerList.push_back(listener);
- eventListenerListMap_[name] = eventListenerList;
- } else {
- EventListenerList& eventListenerList = itListenerList->second;
- // does this listener exist?
- bool found = false;
- for (auto item : eventListenerList) {
- if (item.callback_->IsSame(listener.callback_)) {
- found = true;
- break;
- }
- }
-
- if (!found)
- eventListenerList.push_back(listener);
- }
-}
-
-void
-CefViewBridgeObject::RemoveEventListener(const CefString& name, const EventListener& listener)
-{
- auto itListenerList = eventListenerListMap_.find(name);
- if (itListenerList != eventListenerListMap_.end()) {
- EventListenerList& eventListenerList = itListenerList->second;
- for (auto itListener = eventListenerList.begin(); itListener != eventListenerList.end(); itListener++) {
- if (itListener->callback_->IsSame(listener.callback_)) {
- eventListenerList.erase(itListener);
- break;
- }
- }
- }
-}
-
-void
-CefViewBridgeObject::ExecuteEventListener(const CefString eventName, CefRefPtr args)
-{
- // find the listeners
- auto itListenerList = eventListenerListMap_.find(eventName);
- if (itListenerList == eventListenerListMap_.end()) {
- return;
- }
-
- EventListenerList& eventListenerList = itListenerList->second;
- for (auto listener : eventListenerList) {
- listener.context_->Enter();
-
- // convert argument list from CefValue to CefV8Value
- CefV8ValueList v8ArgList;
- for (size_t i = 0; i < args->GetSize(); i++) {
- auto cefValue = args->GetValue(i);
- auto v8Value = CefValueToV8Value(cefValue.get());
- v8ArgList.push_back(v8Value.get());
- }
-
- listener.callback_->ExecuteFunction(bridgeObject_, v8ArgList);
- listener.context_->Exit();
- }
-}
diff --git a/src/QCefWidget/Bridge/CefViewBridgeObject.h b/src/QCefWidget/Bridge/CefViewBridgeObject.h
deleted file mode 100644
index 66ac759..0000000
--- a/src/QCefWidget/Bridge/CefViewBridgeObject.h
+++ /dev/null
@@ -1,221 +0,0 @@
-#pragma once
-#pragma region stl_headers
-#include
-#include