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 -#pragma endregion - -#pragma region cef_headers -#include -#pragma endregion - -/// -/// -/// -class CefViewBridgeObject : public CefBaseRefCounted -{ - IMPLEMENT_REFCOUNTING(CefViewBridgeObject); - DISALLOW_COPY_AND_ASSIGN(CefViewBridgeObject); - - /// - /// - /// - typedef struct _EventListener - { - CefRefPtr callback_; - CefRefPtr context_; - } EventListener; - - /// - /// - /// - typedef std::list EventListenerList; - - /// - /// - /// - typedef std::map> EventListenerListMap; - - /// - /// - /// - class V8Handler : public CefV8Handler - { - public: - /// - /// - /// - /// - V8Handler(CefViewBridgeObject* object); - - /// - /// - /// - /// - /// - /// - /// - /// - /// - virtual bool Execute(const CefString& function, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) override; - - protected: - /// - /// - /// - /// - /// - /// - /// - void ExecuteNativeMethod(CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception); - - /// - /// - /// - /// - /// - /// - /// - void ExecuteAddEventListener(CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception); - - /// - /// - /// - /// - /// - /// - /// - void ExecuteRemoveEventListener(CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception); - - /// - /// - /// - /// - /// - /// - /// - void ExecuteReportJSResult(CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception); - - private: - /// - /// - /// - CefViewBridgeObject* object_; - - private: - IMPLEMENT_REFCOUNTING(V8Handler); - }; - -public: - /// - /// - /// - /// - /// - /// - /// - CefViewBridgeObject(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr global, - const CefString& name); - - /// - /// - /// - /// - /// - /// - CefRefPtr CefValueToV8Value(CefValue* cefValue); - - /// - /// - /// - /// - /// - CefRefPtr V8ValueToCefValue(CefV8Value* v8Value); - - /// - /// - /// - /// - void AsyncExecuteNativeMethod(const CefV8ValueList& arguments); - - /// - /// - /// - /// - void AsyncExecuteReportJSResult(const CefV8ValueList& arguments); - - /// - /// - /// - /// - /// - /// - void AddEventListener(const CefString& name, const EventListener& listener); - - /// - /// - /// - /// - /// - void RemoveEventListener(const CefString& name, const EventListener& listener); - - /// - /// - /// - /// - /// - void ExecuteEventListener(const CefString eventName, CefRefPtr args); - -private: - /// - /// - /// - CefString name_; - - /// - /// - /// - CefRefPtr bridgeObject_; - - /// - /// - /// - CefRefPtr reportJSResultFunction_; - - /// - /// - /// - CefRefPtr browser_; - - /// - /// - /// - CefRefPtr frame_; - - /// - /// - /// - CefRefPtr v8Handler_; - - /// - /// - /// - CefViewBridgeObject::EventListenerListMap eventListenerListMap_; -}; diff --git a/src/QCefWidget/CefViewWidget.cpp b/src/QCefWidget/CefViewWidget.cpp deleted file mode 100644 index bf1b892..0000000 --- a/src/QCefWidget/CefViewWidget.cpp +++ /dev/null @@ -1,128 +0,0 @@ -#include "CefViewWidget.h" - -#if defined(Q_OS_WIN) -#include -#elif defined(Q_OS_MAC) -#elif defined(Q_OS_LINUX) -#else -#endif - -#include -#include -#include -#include -#include -#include - -#include "DownloadManager.h" - -CefViewWidget::CefViewWidget(const QString url, const QCefSetting* setting, QWidget* parent /* = 0*/) - : QCefView(url, setting, parent) -{ - // setStyleSheet("background: blue;"); - - connect(this, &CefViewWidget::draggableRegionChanged, this, &CefViewWidget::onDraggableRegionChanged); - connect(this, &CefViewWidget::nativeBrowserCreated, this, &CefViewWidget::onNativeBrowserWindowCreated); -} - -CefViewWidget::~CefViewWidget() {} - -void -CefViewWidget::onScreenChanged(QScreen* screen) -{ - if (!m_pCefWindow) - return; - - updateMask(); -} - -void -CefViewWidget::onNativeBrowserWindowCreated(QWindow* window) -{ - m_pCefWindow = window; - if (!m_pCefWindow) - return; - - connect(this->window()->windowHandle(), SIGNAL(screenChanged(QScreen*)), this, SLOT(onScreenChanged(QScreen*))); - - updateMask(); -} - -void -CefViewWidget::onDraggableRegionChanged(const QRegion& draggableRegion, const QRegion& nonDraggableRegion) -{ - m_draggableRegion = draggableRegion; - m_nonDraggableRegion = nonDraggableRegion; -} - -bool -CefViewWidget::onNewPopup(const QCefFrameId& sourceFrameId, - const QString& targetUrl, - QString& targetFrameName, - QCefView::CefWindowOpenDisposition targetDisposition, - QRect& rect, - QCefSetting& settings, - bool& disableJavascriptAccess) -{ - // create new QCefView as popup browser - // settings.setBackgroundColor(Qt::red); - return false; -} - -void -CefViewWidget::onNewDownloadItem(const QSharedPointer& item, const QString& suggestedName) -{ - // keep the item into list or map, and call item->start() to allow the download - - DownloadManager::getInstance().AddNewDownloadItem(item); -} - -void -CefViewWidget::onUpdateDownloadItem(const QSharedPointer& item) -{ - - // control the download by invoking item->pause(), item->resume(), item->cancel() - - DownloadManager::getInstance().UpdateDownloadItem(item); -} - -void -CefViewWidget::resizeEvent(QResizeEvent* event) -{ - // update mask first, because the new mask will be - // used in the QCefView::resizeEvent - updateMask(); - - QCefView::resizeEvent(event); -} - -void -CefViewWidget::mousePressEvent(QMouseEvent* event) -{ - QCefView::mousePressEvent(event); - -#if defined(Q_OS_WIN) - if (event->buttons().testFlag(Qt::LeftButton) && m_draggableRegion.contains(event->pos())) { - HWND hWnd = ::GetAncestor((HWND)(window()->windowHandle()->winId()), GA_ROOT); - POINT pt; - ::GetCursorPos(&pt); - ::ReleaseCapture(); - ::SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, POINTTOPOINTS(pt)); - } -#elif defined(Q_OS_MAC) -#elif defined(Q_OS_LINUX) -#else -#endif -} - -void -CefViewWidget::updateMask() -{ - // create a rect with rounded corner (50px radius) as mask - QPainterPath path; - path.addRoundedRect(rect(), 50, 50); - QRegion mask = QRegion(path.toFillPolygon().toPolygon()); - - // apply the mask - setMask(mask); -} diff --git a/src/QCefWidget/CefViewWidget.h b/src/QCefWidget/CefViewWidget.h deleted file mode 100644 index 7c25899..0000000 --- a/src/QCefWidget/CefViewWidget.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef CUSTOMCEFVIEW_H -#define CUSTOMCEFVIEW_H - -#include - -#include - -/// -/// Represents the customized QCefView -/// -class CefViewWidget : public QCefView -{ - Q_OBJECT - -public: - CefViewWidget(const QString url, const QCefSetting* setting, QWidget* parent = 0); - - ~CefViewWidget(); - -protected slots: - void onScreenChanged(QScreen* screen); - - void onNativeBrowserWindowCreated(QWindow* window); - - void onDraggableRegionChanged(const QRegion& draggableRegion, const QRegion& nonDraggableRegion); - -protected: - bool onNewPopup(const QCefFrameId& sourceFrameId, - const QString& targetUrl, - QString& targetFrameName, - QCefView::CefWindowOpenDisposition targetDisposition, - QRect& rect, - QCefSetting& settings, - bool& disableJavascriptAccess) override; - - void onNewDownloadItem(const QSharedPointer& item, const QString& suggestedName) override; - - void onUpdateDownloadItem(const QSharedPointer& item) override; - -protected: - void resizeEvent(QResizeEvent* event) override; - - void mousePressEvent(QMouseEvent* event) override; - -private: - void updateMask(); - -private: - QWindow* m_pCefWindow = nullptr; - - int m_iCornerRadius = 50; - - QRegion m_draggableRegion; - - QRegion m_nonDraggableRegion; -}; - -#endif // CUSTOMCEFVIEW_H diff --git a/src/QCefWidget/CefWidget.cpp b/src/QCefWidget/CefWidget.cpp index 64f9c9a..5a9755e 100644 --- a/src/QCefWidget/CefWidget.cpp +++ b/src/QCefWidget/CefWidget.cpp @@ -67,7 +67,7 @@ void CefWidget::initBrowser() m_CefWidget = nullptr; } setting.setHardwareAcceleration(true); - m_CefWidget = new CefViewWidget("", &setting, this); + m_CefWidget = new QCefView("about:blank", &setting, this); connect(m_CefWidget, &QCefView::invokeMethod, this, &CefWidget::onInvokeMethod); connect(m_CefWidget, &QCefView::cefUrlRequest, this, &CefWidget::onQCefUrlRequest); connect(m_CefWidget, &QCefView::cefQueryRequest, this, &CefWidget::onQCefQueryRequest); diff --git a/src/QCefWidget/CefWidget.h b/src/QCefWidget/CefWidget.h index 14e627d..b16628c 100644 --- a/src/QCefWidget/CefWidget.h +++ b/src/QCefWidget/CefWidget.h @@ -7,7 +7,7 @@ #include #include #include -#include "CefViewWidget.h" +#include class CefWidget : public QWidget { diff --git a/src/QCefWidget/Common/CefViewCoreLog.cpp b/src/QCefWidget/Common/CefViewCoreLog.cpp deleted file mode 100644 index 3d2fc02..0000000 --- a/src/QCefWidget/Common/CefViewCoreLog.cpp +++ /dev/null @@ -1,141 +0,0 @@ -// -// CefViewCoreLog.cpp -// CefViewCore -// -// Created by Sheen Tian on 2020/6/19. -// - -#include "CefViewCoreLog.h" - -#include -#include -#include - -typedef enum log_level -{ - ll_debug = 1, - ll_info, - ll_error, - ll_fatal, -} log_level; - -#if defined(__APPLE__) -#include -void -cefView_log(log_level level, const char* message) -{ - switch (level) { - case ll_debug: - os_log_debug(OS_LOG_DEFAULT, "[DEBUG]%s", message); - break; - case ll_info: - os_log_info(OS_LOG_DEFAULT, "[INFO]%s", message); - break; - case ll_error: - os_log_error(OS_LOG_DEFAULT, "[ERROR]%s", message); - break; - case ll_fatal: - os_log_fault(OS_LOG_DEFAULT, "[FATAL]%s", message); - break; - default: - break; - } -} -#elif defined(_WIN32) -#include -void -cefView_log(log_level level, const char* message) -{ - std::string msg; - switch (level) { - case ll_debug: - msg = "[DEBUG]"; - break; - case ll_info: - msg = "[INFO]"; - break; - case ll_error: - msg = "[ERROR]"; - break; - case ll_fatal: - msg = "[FATAL]"; - break; - default: - msg = "[]"; - break; - } - msg += message; - msg += "\r\n"; - OutputDebugStringA(msg.c_str()); -} -#elif defined(__linux__) -#include -void -cefView_log(log_level level, const char* message) -{ - switch (level) { - case ll_debug: - syslog(LOG_USER | LOG_DEBUG, "[DEBUG]%s", message); - break; - case ll_info: - syslog(LOG_USER | LOG_INFO, "[INFO]%s", message); - break; - case ll_error: - syslog(LOG_USER | LOG_ERR, "[ERROR]%s", message); - break; - case ll_fatal: - syslog(LOG_USER | LOG_CRIT, "[FATAL]%s", message); - break; - default: - break; - } -} -#else -#error "unsupported platform" -#endif - -#define LOG_MSG_BUFFER_LIMIT 4096 - -void -log_debug(const char* fmt, ...) -{ - std::vector msg(LOG_MSG_BUFFER_LIMIT, 0); - va_list args; - va_start(args, fmt); - vsnprintf(msg.data(), LOG_MSG_BUFFER_LIMIT, fmt, args); - va_end(args); - cefView_log(ll_debug, msg.data()); -} - -void -log_info(const char* fmt, ...) -{ - std::vector msg(LOG_MSG_BUFFER_LIMIT, 0); - va_list args; - va_start(args, fmt); - vsnprintf(msg.data(), LOG_MSG_BUFFER_LIMIT, fmt, args); - va_end(args); - cefView_log(ll_info, msg.data()); -} - -void -log_error(const char* fmt, ...) -{ - std::vector msg(LOG_MSG_BUFFER_LIMIT, 0); - va_list args; - va_start(args, fmt); - vsnprintf(msg.data(), LOG_MSG_BUFFER_LIMIT, fmt, args); - va_end(args); - cefView_log(ll_error, msg.data()); -} - -void -log_fatal(const char* fmt, ...) -{ - std::vector msg(LOG_MSG_BUFFER_LIMIT, 0); - va_list args; - va_start(args, fmt); - vsnprintf(msg.data(), LOG_MSG_BUFFER_LIMIT, fmt, args); - va_end(args); - cefView_log(ll_fatal, msg.data()); -} diff --git a/src/QCefWidget/Common/CefViewCoreLog.h b/src/QCefWidget/Common/CefViewCoreLog.h deleted file mode 100644 index 93bee26..0000000 --- a/src/QCefWidget/Common/CefViewCoreLog.h +++ /dev/null @@ -1,57 +0,0 @@ -// -// CefViewCoreLog.h -// CefViewCore -// -// Created by Sheen Tian on 2020/6/19. -// - -#ifndef CefViewCoreLog_h -#define CefViewCoreLog_h -#pragma once -#include - -void -log_debug(const char* fmt, ...); -void -log_info(const char* fmt, ...); -void -log_error(const char* fmt, ...); -void -log_fatal(const char* fmt, ...); - -class ScopeLogger -{ -public: - ScopeLogger(const std::string& fn) - : functionName_(fn) - { - // enter scope - log_debug("+++ %s", functionName_.c_str()); - } - - ~ScopeLogger() - { - // leave scope - log_debug("--- %s", functionName_.c_str()); - } - - std::string functionName_; -}; - -#if (defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)) -// DEBUG BUILD -#define logD(format, ...) log_debug(format, ##__VA_ARGS__) -#define logI(format, ...) log_info(format, ##__VA_ARGS__) -#define logE(format, ...) log_error(format, ##__VA_ARGS__) -#define logF(format, ...) log_fatal(format, ##__VA_ARGS__) -#define logScope() ScopeLogger __scope_logger__(__FUNCTION__); -#else -// RELEASE BUILD -#define logD(format, ...) -#define logI(format, ...) log_info(format, ##__VA_ARGS__) -#define logE(format, ...) log_error(format, ##__VA_ARGS__) -#define logF(format, ...) log_fatal(format, ##__VA_ARGS__) -#define logScope() -#endif - -#endif /* CefViewCoreLog_hpp */ diff --git a/src/QCefWidget/Common/CefViewDebug.cpp b/src/QCefWidget/Common/CefViewDebug.cpp deleted file mode 100644 index 60be81f..0000000 --- a/src/QCefWidget/Common/CefViewDebug.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// -// CefViewCoreLog.cpp -// CefViewCore -// -// Created by leashi on 2022/5/10. -// - -#include - -#include "CefViewDebug.h" - -#include - -std::string -toString(CefRefPtr browser) -{ - std::string msg; - - msg += "( "; - msg += "CefBrowser:"; - msg += ", ptr=" + std::to_string((int64_t)browser.get()); -#if CEF_VERSION_MAJOR > 91 - msg += ", IsValid=" + std::to_string(browser->IsValid()); -#endif - msg += ", GetHost=" + std::to_string((int64_t)browser->GetHost().get()); - msg += ", CanGoBack=" + std::to_string(browser->CanGoBack()); - msg += ", CanGoForward=" + std::to_string(browser->CanGoForward()); - msg += ", IsLoading=" + std::to_string(browser->IsLoading()); - msg += ", GetIdentifier=" + std::to_string(browser->GetIdentifier()); - msg += ", IsPopup=" + std::to_string(browser->IsPopup()); - msg += ", HasDocument=" + std::to_string(browser->HasDocument()); - msg += ", GetMainFrame=" + std::to_string((int64_t)browser->GetMainFrame().get()); - msg += ", GetFocusedFrame=" + std::to_string((int64_t)browser->GetFocusedFrame().get()); - msg += ", GetFrameCount=" + std::to_string(browser->GetFrameCount()); - msg += " )"; - - return msg; -} - -std::string -toString(CefRefPtr frame) -{ - std::string msg; - - msg += "( "; - msg += "CefFrame:"; - msg += ", ptr=" + std::to_string((int64_t)frame.get()); - msg += ", IsValid=" + std::to_string(frame->IsValid()); - msg += ", IsMain=" + std::to_string(frame->IsMain()); - msg += ", IsFocused=" + std::to_string(frame->IsFocused()); - msg += ", GetName=" + frame->GetName().ToString(); -#if CEF_VERSION_MAJOR < 122 - msg += ", GetIdentifier=" + std::to_string(frame->GetIdentifier()); -#else - msg += ", GetIdentifier=" + frame->GetIdentifier().ToString(); -#endif - msg += ", GetParent=" + std::to_string((int64_t)frame->GetParent().get()); - msg += ", GetURL=" + frame->GetURL().ToString(); - msg += ", GetBrowser=" + std::to_string((int64_t)frame->GetBrowser().get()); - // msg += ", GetV8Context=" + std::to_string((int64_t)frame->GetV8Context().get()); - msg += " )"; - - return msg; -} diff --git a/src/QCefWidget/Common/CefViewDebug.h b/src/QCefWidget/Common/CefViewDebug.h deleted file mode 100644 index 7f37ceb..0000000 --- a/src/QCefWidget/Common/CefViewDebug.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// CefViewDebug.h -// CefViewCore -// -// Created by leashi on 2022/5/10. -// - -#ifndef CefViewDebug_h -#define CefViewDebug_h - -#pragma once - -#include -#include - - -std::string toString(CefRefPtr browser); -std::string toString(CefRefPtr frame); - - -#endif /* CefViewDebug_h */ diff --git a/src/QCefWidget/DownloadManager.cpp b/src/QCefWidget/DownloadManager.cpp deleted file mode 100644 index 38ada2a..0000000 --- a/src/QCefWidget/DownloadManager.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "DownloadManager.h" - -#include - -DownloadManager& -DownloadManager::getInstance() -{ - static DownloadManager s_instance; - return s_instance; -} - -void -DownloadManager::AddNewDownloadItem(const QSharedPointer& item) -{ - qDebug() << "DownloadManager::AddNewDownloadItem:" - << " id: " << item->id() << "\n" - << " name: " << item->suggestedFileName() << "\n" - << " path: " << item->fullPath() << "\n" - << " percent: " << item->percentComplete() << "%, " << item->totalBytes() << "/" << item->receivedBytes() - << "\n" - << " canceled: " << item->isCanceled() << "\n" - << " complete: " << item->isComplete(); - - m_mapDownloadingItem[item->id()] = item; - item->start("", true); -} - -void -DownloadManager::UpdateDownloadItem(const QSharedPointer& item) -{ - qDebug() << "DownloadManager::UpdateDownloadItem:" - << " id: " << item->id() << "\n" - << " name: " << item->suggestedFileName() << "\n" - << " path: " << item->fullPath() << "\n" - << " percent: " << item->percentComplete() << "%, " << item->totalBytes() << "/" << item->receivedBytes() - << "\n" - << " canceled: " << item->isCanceled() << "\n" - << " complete: " << item->isComplete(); - - if (item->isCanceled() || item->isComplete()) - m_mapDownloadingItem.remove(item->id()); -} - -DownloadManager::DownloadManager() {} - -DownloadManager::~DownloadManager() -{ - for (auto& item : m_mapDownloadingItem) { - item->cancel(); - } - m_mapDownloadingItem.clear(); -} diff --git a/src/QCefWidget/DownloadManager.h b/src/QCefWidget/DownloadManager.h deleted file mode 100644 index e21c76d..0000000 --- a/src/QCefWidget/DownloadManager.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef DOWNLOADMANAGER_H -#define DOWNLOADMANAGER_H -#pragma once - -#include -#include - -#include - -class DownloadManager -{ -public: - static DownloadManager& getInstance(); - - void AddNewDownloadItem(const QSharedPointer& item); - - void UpdateDownloadItem(const QSharedPointer& item); - -private: - DownloadManager(); - ~DownloadManager(); - - QMap> m_mapDownloadingItem; -}; - -#endif diff --git a/src/QCefWidget/MainWindow.cpp b/src/QCefWidget/MainWindow.cpp deleted file mode 100644 index d98d205..0000000 --- a/src/QCefWidget/MainWindow.cpp +++ /dev/null @@ -1,317 +0,0 @@ -#include "MainWindow.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define URL_ROOT "http://QCefViewDoc" -#define LEFT_INDEX_URL URL_ROOT "/left.html" -#define RIGHT_INDEX_URL URL_ROOT "/right.html" - -MainWindow::MainWindow(QWidget* parent) - : QMainWindow(parent /*, Qt::FramelessWindowHint*/) -{ - m_ui.setupUi(this); - -#ifdef Q_OS_MACOS - this->m_ui.nativeContainer->setContentsMargins(0, 28, 0, 0); -#endif - - setupWindow(); - // setWindowFlags(Qt::FramelessWindowHint); - // setAttribute(Qt::WA_TranslucentBackground); - - connect(m_ui.btn_showDevTools, &QPushButton::clicked, this, &MainWindow::onBtnShowDevToolsClicked); - connect(m_ui.btn_reloadRight, &QPushButton::clicked, this, &MainWindow::onBtnReloadRightViewClicked); - connect(m_ui.btn_recreateRight, &QPushButton::clicked, this, &MainWindow::onBtnRecreateRightViewClicked); - connect(m_ui.btn_changeColor, &QPushButton::clicked, this, &MainWindow::onBtnChangeColorClicked); - connect(m_ui.btn_setFocus, &QPushButton::clicked, this, &MainWindow::onBtnSetFocusClicked); - connect(m_ui.btn_callJSCode, &QPushButton::clicked, this, &MainWindow::onBtnCallJSCodeClicked); - connect(m_ui.btn_newBrowser, &QPushButton::clicked, this, &MainWindow::onBtnNewBrowserClicked); - connect(m_ui.btn_quitApp, &QPushButton::clicked, qApp, &QCoreApplication::quit); - - // build the path to the web resource - QDir dir = QCoreApplication::applicationDirPath(); -// #if defined(Q_OS_MACOS) -// QString webResourceDir = /*QString("file://") +*/ QDir::toNativeSeparators(dir.filePath("../Resources/webres")); -// #else -// QString webResourceDir = /*QString("file://") +*/ QDir::toNativeSeparators(dir.filePath("webres")); -// #endif - -// // add a local folder to URL map (global) -// QCefContext::instance()->addLocalFolderResource(webResourceDir, URL_ROOT); - - createLeftCefView(); - createRightCefView(); -} - -MainWindow::~MainWindow() {} - -void -MainWindow::createLeftCefView() -{ - if (m_pLeftCefViewWidget) { - m_pLeftCefViewWidget->deleteLater(); - m_pLeftCefViewWidget = nullptr; - } - - QCefSetting setting; - setting.setWindowlessFrameRate(1000); - setting.setHardwareAcceleration(true); - setting.setWindowInitialSize(QSize(1000,800)); - // setting.setBackgroundColor(Qt::magenta); - m_pLeftCefViewWidget = new CefViewWidget("https://www.testufo.com/", &setting, this); - // connect the invokeMethod to the slot - connect(m_pLeftCefViewWidget, &QCefView::invokeMethod, this, &MainWindow::onInvokeMethod); - - // connect the cefQueryRequest to the slot - connect(m_pLeftCefViewWidget, &QCefView::cefUrlRequest, this, &MainWindow::onQCefUrlRequest); - connect(m_pLeftCefViewWidget, &QCefView::cefQueryRequest, this, &MainWindow::onQCefQueryRequest); - connect(m_pLeftCefViewWidget, &QCefView::reportJavascriptResult, this, &MainWindow::onJavascriptResult); - connect(m_pLeftCefViewWidget, &QCefView::loadStart, this, &MainWindow::onLoadStart); - connect(m_pLeftCefViewWidget, &QCefView::loadEnd, this, &MainWindow::onLoadEnd); - connect(m_pLeftCefViewWidget, &QCefView::loadError, this, &MainWindow::onLoadError); - - m_ui.leftCefViewContainer->layout()->addWidget(m_pLeftCefViewWidget); -} - -void -MainWindow::createRightCefView() -{ - if (m_pRightCefViewWidget) { - m_pRightCefViewWidget->deleteLater(); - m_pRightCefViewWidget = nullptr; - } - - // build settings for per QCefView - QCefSetting setting; -#if CEF_VERSION_MAJOR < 100 - setting.setPlugins(false); -#endif - setting.setWindowlessFrameRate(1000); - setting.setHardwareAcceleration(true); - QColor background(0, 255, 0, 255); - setting.setBackgroundColor(background); - setting.setWindowInitialSize(QSize(1000,800)); - // create the QCefView widget and add it to the layout container - // m_pRightCefViewWidget = new QCefView(RIGHT_INDEX_URL, &setting, this); - m_pRightCefViewWidget = new QCefView("https://www.testufo.com/", &setting, this); - - // auto vl = new QVBoxLayout(m_pRightCefViewWidget); - // auto btn = new QPushButton("TEST BUTTON OVERLAY", m_pRightCefViewWidget); - //// btn->setFixedSize(320, 240); - // btn->setStyleSheet("background-color: rgba(1, 1, 1, 0);"); - // btn->setAttribute(Qt::WA_TranslucentBackground); - // btn->setWindowFlags(Qt::FramelessWindowHint); - // btn->setAttribute(Qt::WA_NoSystemBackground); - // vl->setAlignment(Qt::AlignVCenter); - - // vl->addWidget(btn); - // m_pRightCefViewWidget->setLayout(vl); - - // all the following values will disable the context menu for both NCW and OSR mode - // m_pRightCefViewWidget->setContextMenuPolicy(Qt::NoContextMenu); - // m_pRightCefViewWidget->setContextMenuPolicy(Qt::ActionsContextMenu); - // m_pRightCefViewWidget->setContextMenuPolicy(Qt::CustomContextMenu); - // m_pRightCefViewWidget->setContextMenuPolicy(Qt::PreventContextMenu); - m_pRightCefViewWidget->setContextMenuPolicy(Qt::DefaultContextMenu); - - // add the QCefView widget to the layout - m_ui.rightCefViewContainer->layout()->addWidget(m_pRightCefViewWidget); -} - -void -MainWindow::onInvokeMethod(const QCefBrowserId& browserId, - const QCefFrameId& frameId, - const QString& method, - const QVariantList& arguments) -{ - // extract the arguments and dispatch the invocation to corresponding handler - if (0 == method.compare("TestMethod")) { - QString title("QCef InvokeMethod Notify"); - QString text = QString("================== Current Thread: QT_UI ==================\r\n" - "Frame: %1\r\n" - "Method: %2\r\n" - "Arguments:\r\n") - .arg(frameId) - .arg(method); - - for (int i = 0; i < arguments.size(); i++) { - auto jv = QJsonValue::fromVariant(arguments[i]); - - // clang-format off - text.append( - QString("%1 Type:%2, Value:%3\r\n") - .arg(i).arg(arguments[i].typeName()).arg(arguments[i].toString()) - ); - // clang-format on - } - - auto jsonValue = QJsonDocument::fromVariant(arguments); - auto jsonString = QString(jsonValue.toJson()); - text.append(QString("\r\nArguments List in JSON format:\r\n%1").arg(jsonString)); - - QMessageBox::information(this->window(), title, text); - } else { - } -} - -void -MainWindow::onQCefUrlRequest(const QCefBrowserId& browserId, const QCefFrameId& frameId, const QString& url) -{ - QString title("QCef URL Request"); - QString text = QString("Current Thread: QT_UI\r\n" - "URL: %1") - .arg(url); - - QMessageBox::information(this->window(), title, text); -} - -void -MainWindow::onQCefQueryRequest(const QCefBrowserId& browserId, const QCefFrameId& frameId, const QCefQuery& query) -{ - QString title("QCef Query Request"); - QString text = QString("Current Thread: QT_UI\r\n" - "Query: %1") - .arg(query.request()); - - QMessageBox::information(this->window(), title, text); - - QString response = query.request().toUpper(); - query.setResponseResult(true, response); - m_pLeftCefViewWidget->responseQCefQuery(query); -} - -void -MainWindow::onJavascriptResult(const QCefBrowserId& browserId, - const QCefFrameId& frameId, - const QString& context, - const QVariant& result) -{ - auto jsonValue = QJsonDocument::fromVariant(result); - auto jsonString = QString(jsonValue.toJson()); - - QString title("Javascript result notification"); - QString text = QString("Context: %1\r\nResult in JSON format:\r\n%2").arg(context).arg(jsonString); - - QMessageBox::information(this->window(), title, text); -} - -void -MainWindow::onLoadingStateChanged(const QCefBrowserId& browserId, bool isLoading, bool canGoBack, bool canGoForward) -{ - qDebug() << "onLoadingStateChanged, browserId:" << browserId << ", isLoading:" << isLoading - << ", canGoBack:" << canGoBack << ", canGoForward:" << canGoForward; -} - -void -MainWindow::onLoadStart(const QCefBrowserId& browserId, - const QCefFrameId& frameId, - bool isMainFrame, - int transitionType) -{ - qDebug() << "onLoadStart, browserId:" << browserId << ", frameId:" << frameId << ", isMainFrame:" << isMainFrame - << ", transitionType:" << transitionType; -} - -void -MainWindow::onLoadEnd(const QCefBrowserId& browserId, const QCefFrameId& frameId, bool isMainFrame, int httpStatusCode) -{ - qDebug() << "onLoadEnd, browserId:" << browserId << ", frameId:" << frameId << ", isMainFrame:" << isMainFrame - << ", httpStatusCode:" << httpStatusCode; -} - -void -MainWindow::onLoadError(const QCefBrowserId& browserId, - const QCefFrameId& frameId, - bool isMainFrame, - int errorCode, - const QString& errorMsg, - const QString& failedUrl) -{ - qDebug() << "onLoadError, browserId:" << browserId << ", frameId:" << frameId << ", isMainFrame:" << isMainFrame - << ", errorCode:" << errorCode; -} - -void -MainWindow::onBtnShowDevToolsClicked() -{ - if (m_pLeftCefViewWidget) { - m_pLeftCefViewWidget->showDevTools(); - } -} - -void -MainWindow::onBtnReloadRightViewClicked() -{ - if (m_pRightCefViewWidget) { - m_pRightCefViewWidget->navigateToUrl("https://www.google.com"); - } -} - -void -MainWindow::onBtnRecreateRightViewClicked() -{ - createRightCefView(); -} - -void -MainWindow::onBtnChangeColorClicked() -{ - if (m_pLeftCefViewWidget) { - // create a random color - QColor color(QRandomGenerator::global()->generate()); - - // create the cef event and set the arguments - QCefEvent event("colorChange"); - event.arguments().append(QVariant::fromValue(color.name(QColor::HexArgb))); - - // broadcast the event to all frames in all browsers created by this QCefView widget - m_pLeftCefViewWidget->broadcastEvent(event); - } -} - -void -MainWindow::onBtnCallJSCodeClicked() -{ - QString context = "helloQCefView"; - QString code = "alert('hello QCefView'); return {k1: 'str', k2: true, k3: 100};"; - m_pLeftCefViewWidget->executeJavascriptWithResult(QCefView::MainFrameID, code, "", context); -} - -void -MainWindow::onBtnSetFocusClicked() -{ - if (m_pLeftCefViewWidget) { - m_pLeftCefViewWidget->setFocus(); - } -} - -void -MainWindow::onBtnNewBrowserClicked() -{ - QMainWindow* w = new QMainWindow(nullptr); - w->setAttribute(Qt::WA_DeleteOnClose); - - QCefSetting settings; - QCefView* view = new QCefView("https://cefview.github.io/QCefView/", &settings, w); - - w->setCentralWidget(view); - w->resize(1024, 768); - w->show(); -} - -#ifndef Q_OS_MACOS -void -MainWindow::setupWindow() -{ - -} -#endif diff --git a/src/QCefWidget/MainWindow.h b/src/QCefWidget/MainWindow.h deleted file mode 100644 index 019e16c..0000000 --- a/src/QCefWidget/MainWindow.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef QCEFVIEWTEST_H -#define QCEFVIEWTEST_H - -#include -#include - -#include "ui_MainWindow.h" - -#include "CefViewWidget.h" - -class MainWindow : public QMainWindow -{ - Q_OBJECT - -public: - MainWindow(QWidget* parent = 0); - ~MainWindow(); - -protected: - void createLeftCefView(); - void createRightCefView(); - void setupWindow(); - - // QCefView slots -protected slots: - - void onInvokeMethod(const QCefBrowserId& browserId, - const QCefFrameId& frameId, - const QString& method, - const QVariantList& arguments); - - void onQCefUrlRequest(const QCefBrowserId& browserId, const QCefFrameId& frameId, const QString& url); - - void onQCefQueryRequest(const QCefBrowserId& browserId, const QCefFrameId& frameId, const QCefQuery& query); - - void onJavascriptResult(const QCefBrowserId& browserId, - const QCefFrameId& frameId, - const QString& context, - const QVariant& result); - - void onLoadingStateChanged(const QCefBrowserId& browserId, bool isLoading, bool canGoBack, bool canGoForward); - - void onLoadStart(const QCefBrowserId& browserId, const QCefFrameId& frameId, bool isMainFrame, int transitionType); - - void onLoadEnd(const QCefBrowserId& browserId, const QCefFrameId& frameId, bool isMainFrame, int httpStatusCode); - - void onLoadError(const QCefBrowserId& browserId, - const QCefFrameId& frameId, - bool isMainFrame, - int errorCode, - const QString& errorMsg, - const QString& failedUrl); - - // ui slots -protected slots: - void onBtnShowDevToolsClicked(); - - void onBtnReloadRightViewClicked(); - - void onBtnRecreateRightViewClicked(); - - void onBtnChangeColorClicked(); - - void onBtnSetFocusClicked(); - - void onBtnCallJSCodeClicked(); - - void onBtnNewBrowserClicked(); - -private: - Ui::MainWindow m_ui; - - QCefView* m_pLeftCefViewWidget = nullptr; - QCefView* m_pRightCefViewWidget = nullptr; -}; - -#endif // QCEFVIEWTEST_H diff --git a/src/QCefWidget/MainWindow.ui b/src/QCefWidget/MainWindow.ui deleted file mode 100644 index 8aefc20..0000000 --- a/src/QCefWidget/MainWindow.ui +++ /dev/null @@ -1,250 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 1280 - 900 - - - - QCefViewTest - - - - - 3 - - - 2 - - - 2 - - - 2 - - - 2 - - - - - - 0 - 0 - - - - - #nativeContainer { - background-color: rgb(170, 255, 255); - } - - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - #label{ - font: 12pt "MS Shell Dlg 2"; - } - - - - Native Area - - - Qt::AlignCenter - - - - - - - Show Left DevTools - - - - - - - Reload Right QCefView - - - - - - - Recreate Right QCefView - - - - - - - ChangeColor - - - - - - - - - - SetFocus - - - - - - - - - - CallJSCode - - - - - - - - - - NewBrowser - - - - - - - Exit App - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - 0 - 0 - - - - QFrame::Plain - - - Qt::Horizontal - - - - QWidget#leftCefViewContainer { - background-color: rgb(217, 183, 255); -} - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - QWidget#rightCefViewContainer { - background-color: rgb(217, 183, 255); -} - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - btn_showDevTools - btn_reloadRight - btn_recreateRight - btn_changeColor - lineEdit - lineEdit_2 - btn_callJSCode - lineEdit_3 - btn_newBrowser - btn_quitApp - - - - diff --git a/src/main.cpp b/src/main.cpp index 53854e0..bc27b85 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,141 +7,142 @@ #include #include #include -#include "QCefWidget/MainWindow.h" -#include -#include -#include -#include -// // 自定义 CefApp 类 -// class CefAppQt : public CefApp, public CefBrowserProcessHandler -// { -// public: -// CefAppQt() {} - -// // 重写 CefApp 方法 -// CefRefPtr GetBrowserProcessHandler() override -// { -// return this; -// } - -// // 重写 CefBrowserProcessHandler 方法 -// void OnContextInitialized() override -// { -// CefWindowInfo window_info; -// CefBrowserSettings browser_settings; -// browser_settings.windowless_frame_rate = 60; -// CefBrowserHost::CreateBrowser(window_info, nullptr, "https://html5test.opensuse.org", browser_settings, nullptr, nullptr); -// } - -// IMPLEMENT_REFCOUNTING(CefAppQt); -// }; - -// int main(int argc, char *argv[]) -// { -// HINSTANCE hInstance = GetModuleHandle(NULL); -// CefMainArgs main_args(hInstance); - -// // 处理多进程逻辑 -// CefRefPtr app(new CefAppQt); -// int exit_code = CefExecuteProcess(main_args, app, nullptr); -// if (exit_code >= 0) -// { -// std::cerr << "exit code:" << exit_code << std::endl; -// return exit_code; -// } - -// // 初始化 CEF -// CefSettings settings; -// settings.windowless_rendering_enabled = true; -// settings.multi_threaded_message_loop = false; -// settings.external_message_pump = false; -// settings.no_sandbox = true; - -// // 自定义 root_cache_path -// QString cache = QDir::currentPath() + "/usercache"; -// CefString(&settings.root_cache_path) = cache.toStdString(); -// if (!CefInitialize(main_args, settings, app, nullptr)) -// { -// std::cerr << "CEF initialization failed." << std::endl; -// return 1; -// } -// std::cout << "init CefWidget" << std::endl; -// // 初始化 Qt 应用 -// QApplication a(argc, argv); -// std::cout << "CefRunMessageLoop" << std::endl; -// // 运行 CEF 消息循环 -// CefRunMessageLoop(); -// std::cout << "CefShutdown" << std::endl; -// // 关闭 CEF -// CefShutdown(); - -// return a.exec(); -// } - +#include "QCefWidget/CefWidget.h" +#define DEBUG_PRINT true +void debug_print_argv(int argc, char *argv[]) +{ + if(!argc){ + return; + } + std::lock_guard lock(m_mutex); + DWORD process_id = GetCurrentProcessId(); + std::cout << "Process ID:"<set_type(QD_TYPE::QD_EXIT); -// #endif -// x.show(); + // qputenv("QT_QPA_PLATFORM", "windows:fontengine=freetype"); + // // 加载语言包 + // QTranslator qtBaseTranslator; + // if (!qtBaseTranslator.load(QStringLiteral(":/res/translator/qtbase_zh_CN.qm"))) + // { + // // 处理加载翻译文件失败的情况 + // qDebug() << "Failed to load translation file."; + // return -1; + // } + // a.installTranslator(&qtBaseTranslator); + // // 读取窗体的配置并初始化 + // sui_init_config(); + // ctai x; + // x.init_layout(); + // // 仅限于windows平台 + // #if defined(__WIN32__) + // x.title()->set_type(QD_TYPE::QD_EXIT); + // #endif + // x.show(); a.exec(); qDebug() << "EXIT"; return 0; diff --git a/sui.rc b/sui.rc index 1369b9a..ac3236b 100644 --- a/sui.rc +++ b/sui.rc @@ -1 +1,2 @@ +1 24 compatibility.manifest IDI_ICON1 ICON DISCARDABLE "res\\img\\sui.ico" \ No newline at end of file