9 | #pragma endregion qt_headers
10 |
11 | #ifdef QCEFVIEW_LIB
12 | #define QCEFVIEW_EXPORT Q_DECL_EXPORT
13 | #else
14 | #define QCEFVIEW_EXPORT Q_DECL_IMPORT
15 | #if _WIN32
16 | #pragma comment(lib, "QCefView.lib")
17 | #endif
18 | #endif
19 |
20 | namespace QCefSetting {
21 | ///
22 | ///
23 | ///
24 | void QCEFVIEW_EXPORT
25 | setBrowserSubProcessPath(const QString& path);
26 |
27 | ///
28 | ///
29 | ///
30 | const QCEFVIEW_EXPORT QString
31 | browserSubProcessPath();
32 |
33 | ///
34 | ///
35 | ///
36 | void QCEFVIEW_EXPORT
37 | setResourceDirectoryPath(const QString& path);
38 |
39 | ///
40 | ///
41 | ///
42 | const QCEFVIEW_EXPORT QString
43 | resourceDirectoryPath();
44 |
45 | ///
46 | ///
47 | ///
48 | void QCEFVIEW_EXPORT
49 | setLocalesDirectoryPath(const QString& path);
50 |
51 | ///
52 | ///
53 | ///
54 | const QCEFVIEW_EXPORT QString
55 | localesDirectoryPath();
56 |
57 | ///
58 | ///
59 | ///
60 | void QCEFVIEW_EXPORT
61 | setUserAgent(const QString& agent);
62 |
63 | ///
64 | ///
65 | ///
66 | const QCEFVIEW_EXPORT QString
67 | userAgent();
68 |
69 | ///
70 | ///
71 | ///
72 | void QCEFVIEW_EXPORT
73 | setCachePath(const QString& path);
74 |
75 | ///
76 | ///
77 | ///
78 | const QCEFVIEW_EXPORT QString
79 | cachePath();
80 |
81 | ///
82 | ///
83 | ///
84 | void QCEFVIEW_EXPORT
85 | setUserDataPath(const QString& path);
86 |
87 | ///
88 | ///
89 | ///
90 | const QCEFVIEW_EXPORT QString
91 | userDataPath();
92 |
93 | ///
94 | ///
95 | ///
96 | void QCEFVIEW_EXPORT
97 | setBridgeObjectName(const QString& name);
98 |
99 | ///
100 | ///
101 | ///
102 | const QCEFVIEW_EXPORT QString
103 | bridgeObjectName();
104 |
105 | ///
106 | ///
107 | ///
108 | void QCEFVIEW_EXPORT
109 | setPersistSessionCookies(bool enabled);
110 |
111 | ///
112 | ///
113 | ///
114 | const QCEFVIEW_EXPORT bool
115 | persistSessionCookies();
116 |
117 | ///
118 | ///
119 | ///
120 | void QCEFVIEW_EXPORT
121 | setPersistUserPreferences(bool enabled);
122 |
123 | ///
124 | ///
125 | ///
126 | const QCEFVIEW_EXPORT bool
127 | persistUserPreferences();
128 |
129 | ///
130 | ///
131 | ///
132 | void QCEFVIEW_EXPORT
133 | setLocale(const QString& locale);
134 |
135 | ///
136 | ///
137 | ///
138 | const QCEFVIEW_EXPORT QString
139 | locale();
140 |
141 | ///
142 | ///
143 | ///
144 | void QCEFVIEW_EXPORT
145 | setRemoteDebuggingPort(int port);
146 |
147 | ///
148 | ///
149 | ///
150 | const QCEFVIEW_EXPORT int
151 | remoteDebuggingPort();
152 |
153 | ///
154 | ///
155 | ///
156 | void QCEFVIEW_EXPORT
157 | setBackgroundColor(const QColor& color);
158 |
159 | ///
160 | ///
161 | ///
162 | const QCEFVIEW_EXPORT QColor
163 | backgroundColor();
164 |
165 | ///
166 | ///
167 | ///
168 | void QCEFVIEW_EXPORT
169 | setAcceptLanguageList(const QString& languages);
170 |
171 | ///
172 | ///
173 | ///
174 | const QCEFVIEW_EXPORT QString
175 | acceptLanguageList();
176 |
177 | ///
178 | ///
179 | ///
180 | void QCEFVIEW_EXPORT
181 | setGlobalCookie(const QString& name, const QString& value, const QString& domain, const QString& url);
182 |
183 | };
184 |
185 | #endif
186 |
--------------------------------------------------------------------------------
/test/QCefViewTest/QCefViewTestPage.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
78 |
79 |
80 |
81 | Web Area
82 |
83 | you can drag this window in this area!
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
qcef://test/a/b
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
--------------------------------------------------------------------------------
/src/QCefWing/CefViewRenderApp/RenderDelegates/QCefViewDefaultRenderDelegate.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 | #pragma region std_headers
3 | #include
4 | #pragma endregion
5 |
6 | #pragma region cef_headers
7 | #include
8 | #pragma endregion cef_headers
9 |
10 | #pragma region project_headers
11 | #include "../QCefViewRenderApp.h"
12 | #include "QCefClient.h"
13 | #pragma endregion project_headers
14 |
15 | namespace QCefViewDefaultRenderDelegate {
16 | ///
17 | ///
18 | ///
19 | void
20 | CreateBrowserDelegate(QCefViewRenderApp::RenderDelegateSet& delegates, const CefString& name);
21 |
22 | ///
23 | ///
24 | ///
25 | class RenderDelegate : public QCefViewRenderApp::RenderDelegate
26 | {
27 | ///
28 | ///
29 | ///
30 | typedef std::unordered_map> FrameID2QCefClientMap;
31 |
32 | public:
33 | ///
34 | ///
35 | ///
36 | RenderDelegate(const CefString& name);
37 |
38 | ///
39 | ///
40 | ///
41 | ///
42 | virtual void OnWebKitInitialized(CefRefPtr app);
43 |
44 | ///
45 | ///
46 | ///
47 | ///
48 | ///
49 | ///
50 | ///
51 | virtual void OnContextCreated(CefRefPtr app,
52 | CefRefPtr browser,
53 | CefRefPtr frame,
54 | CefRefPtr context);
55 |
56 | ///
57 | ///
58 | ///
59 | ///
60 | ///
61 | ///
62 | ///
63 | virtual void OnContextReleased(CefRefPtr app,
64 | CefRefPtr browser,
65 | CefRefPtr frame,
66 | CefRefPtr context);
67 |
68 | ///
69 | ///
70 | ///
71 | ///
72 | ///
73 | ///
74 | ///
75 | ///
76 | virtual bool OnProcessMessageReceived(CefRefPtr app,
77 | CefRefPtr browser,
78 | CefRefPtr frame,
79 | CefProcessId source_process,
80 | CefRefPtr message);
81 |
82 | protected:
83 | ///
84 | ///
85 | ///
86 | ///
87 | ///
88 | ///
89 | ///
90 | ///
91 | bool OnTriggerEventNotifyMessage(CefRefPtr browser,
92 | CefRefPtr frame,
93 | CefProcessId source_process,
94 | CefRefPtr message);
95 |
96 | ///
97 | ///
98 | ///
99 | ///
100 | ///
101 | ///
102 | ///
103 | void ExecuteEventListener(CefRefPtr browser,
104 | CefRefPtr frame,
105 | const CefString& name,
106 | CefRefPtr dict);
107 |
108 | private:
109 | ///
110 | ///
111 | ///
112 | CefString bridge_object_name_;
113 |
114 | ///
115 | ///
116 | ///
117 | CefRefPtr render_message_router_;
118 |
119 | ///
120 | ///
121 | ///
122 | FrameID2QCefClientMap frame_id_to_client_map_;
123 |
124 | private:
125 | IMPLEMENT_REFCOUNTING(RenderDelegate);
126 | };
127 |
128 | }
129 |
--------------------------------------------------------------------------------
/test/QCefViewTest/qcefviewtest.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | QCefViewTestClass
4 |
5 |
6 |
7 | 0
8 | 0
9 | 600
10 | 400
11 |
12 |
13 |
14 | QCefViewTest
15 |
16 |
17 |
18 | #centralWidget {
19 | background-color: rgb(0, 85, 0);
20 | }
21 |
22 |
23 |
24 |
25 | 20
26 | 19
27 | 120
28 | 361
29 |
30 |
31 |
32 |
33 | 0
34 | 0
35 |
36 |
37 |
38 |
39 | 120
40 | 0
41 |
42 |
43 |
44 |
45 | 120
46 | 16777215
47 |
48 |
49 |
50 | #nativeContainer {
51 | background-color: rgb(170, 255, 255);
52 | }
53 |
54 |
55 |
56 | 6
57 |
58 |
59 | 0
60 |
61 |
62 | 0
63 |
64 |
65 | 0
66 |
67 |
68 | 0
69 |
70 | -
71 |
72 |
73 | #label{
74 | font: 12pt "MS Shell Dlg 2";
75 | }
76 |
77 |
78 | Native Area
79 |
80 |
81 | Qt::AlignCenter
82 |
83 |
84 |
85 | -
86 |
87 |
88 | ChangeColor
89 |
90 |
91 |
92 | -
93 |
94 |
95 | Qt::Vertical
96 |
97 |
98 |
99 | 20
100 | 40
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 | 230
111 | 20
112 | 331
113 | 351
114 |
115 |
116 |
117 | #cefContainer {
118 | background-color: rgb(85, 170, 255);
119 | }
120 |
121 |
122 |
123 | 0
124 |
125 |
126 | 0
127 |
128 |
129 | 0
130 |
131 |
132 | 0
133 |
134 |
135 | 0
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
--------------------------------------------------------------------------------
/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | #
2 | # The main config file for QCefView
3 | # NOTE:
4 | # Usually there is no need to change this file.
5 | # Change the config.cmake instead.
6 | #
7 | cmake_minimum_required(VERSION 3.18)
8 | project(QCefView)
9 |
10 | # Determine the platform.
11 | if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
12 | set(OS_MACOSX 1)
13 | set(OS_POSIX 1)
14 | elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
15 | set(OS_LINUX 1)
16 | set(OS_POSIX 1)
17 | elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
18 | set(OS_WINDOWS 1)
19 | endif()
20 |
21 | # Determine the project architecture.
22 | if(NOT DEFINED PROJECT_ARCH)
23 | if(CMAKE_SIZEOF_VOID_P MATCHES 8)
24 | set(PROJECT_ARCH "x86_64")
25 | else()
26 | set(PROJECT_ARCH "x86")
27 | endif()
28 |
29 | if(OS_MACOSX)
30 | # PROJECT_ARCH should be specified on Mac OS X.
31 | message(WARNING "No PROJECT_ARCH value specified, using ${PROJECT_ARCH}")
32 | endif()
33 | endif()
34 |
35 | # Set common configurations
36 | ###############################################################
37 | # Use solution folder
38 | set_property(GLOBAL PROPERTY USE_FOLDERS ON)
39 | set(CMAKE_CXX_STANDARD 11)
40 | set(CXX_STANDARD_REQUIRED)
41 | set(CMAKE_CONFIGURATION_TYPES Debug Release)
42 | set(QCEF_VIEW_SDK_OUT ${CMAKE_SOURCE_DIR}/out/${PROJECT_NAME})
43 | set(QCEF_VIEW_SDK_BIN_OUT ${CMAKE_SOURCE_DIR}/out/${PROJECT_NAME}/bin)
44 | set(QCEF_VIEW_SDK_LIB_OUT ${CMAKE_SOURCE_DIR}/out/${PROJECT_NAME}/lib)
45 | set(QCEF_VIEW_SDK_INC_OUT ${CMAKE_SOURCE_DIR}/out/${PROJECT_NAME}/include)
46 | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${QCEF_VIEW_SDK_BIN_OUT})
47 | ###############################################################
48 |
49 | # Include the local config files
50 | ###############################################################
51 | include(config.cmake)
52 | ###############################################################
53 |
54 | # Append the QT dir to CMAKE_PREFIX_PATH
55 | ###############################################################
56 | set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${QT_SDK_DIR})
57 | ###############################################################
58 |
59 |
60 | # Set CEF root dir and append it to CMAKE_MODULE_PATH
61 | ###############################################################
62 | set(CEF_ROOT "${CEF_SDK_DIR}")
63 | set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CEF_ROOT}/cmake")
64 | ###############################################################
65 |
66 |
67 | # Config the CEF
68 | ###############################################################
69 | cmake_policy(SET CMP0074 NEW)
70 | cmake_policy(SET CMP0077 NEW)
71 |
72 | # Set the runtime library type
73 | set(CEF_RUNTIME_LIBRARY_FLAG "/MD" CACHE STRING "Use dynamic runtime")
74 |
75 | # Disable the SANDBOX
76 | set(USE_SANDBOX OFF CACHE BOOL "Disable the Sandbox")
77 |
78 | # Disable the ATL
79 | set(USE_ATL OFF CACHE STRING "Disable the ATL")
80 |
81 | # Find the CEF package
82 | find_package(CEF REQUIRED)
83 |
84 | # Store the libcef.lib path and cef dll wrapper target name
85 | # NOTE: we set this just for simplify the following referring.
86 | set(CEF_LIB_FILE "${CEF_BINARY_DIR}/libcef.lib")
87 | set(CEF_DLL_WRAPPER "libcef_dll_wrapper")
88 |
89 | # Add build target
90 | add_subdirectory(${CEF_LIBCEF_DLL_WRAPPER_PATH})
91 | PRINT_CEF_CONFIG()
92 | ###############################################################
93 |
94 |
95 | # Add all targets
96 | ###############################################################
97 | add_subdirectory(src/QCefProto)
98 |
99 | include_directories(
100 | src/QCefProto
101 | ${CEF_ROOT}
102 | )
103 |
104 | set(QCEF_WING_EXE "QCefWing")
105 | add_subdirectory(src/QCefWing)
106 |
107 | set(QCEF_VIEW_DLL "QCefView")
108 | add_subdirectory(src/QCefView)
109 | ###############################################################
110 |
111 |
112 | # Config the Demo project
113 | ###############################################################
114 | if ((NOT DEFINED SKIP_BUILD_DEMO) OR (SKIP_BUILD_DEMO STREQUAL "") OR (${SKIP_BUILD_DEMO} MATCHES "(FALSE|false|0|OFF)"))
115 | option(SKIP_BUILD_DEMO "Skip building of demo" OFF)
116 | message(STATUS "FLAG SKIP_BUILD_DEMO is OFF")
117 | elseif(${SKIP_BUILD_DEMO} MATCHES "(TRUE|true|1|ON)")
118 | option(SKIP_BUILD_DEMO "Skip building of demo" ON)
119 | message(STATUS "FLAG SKIP_BUILD_DEMO is ON")
120 | else()
121 | message(FATAL_ERROR "++++++++++ INVALID FLAG SKIP_BUILD_DEMO=" ${SKIP_BUILD_DEMO})
122 | endif()
123 |
124 | if (NOT SKIP_BUILD_DEMO)
125 | add_subdirectory(test/QCefViewTest)
126 | endif()
127 | ###############################################################
128 |
--------------------------------------------------------------------------------
/src/QCefWing/CefViewRenderApp/RenderDelegates/QCefViewDefaultRenderDelegate.cpp:
--------------------------------------------------------------------------------
1 | #pragma region project_headers
2 | #include "QCefViewDefaultRenderDelegate.h"
3 | #include "QCefClient.h"
4 | #pragma endregion project_headers
5 |
6 | namespace QCefViewDefaultRenderDelegate {
7 | void
8 | CreateBrowserDelegate(QCefViewRenderApp::RenderDelegateSet& delegates, const CefString& name)
9 | {
10 | delegates.insert(new RenderDelegate(name));
11 | }
12 |
13 | RenderDelegate::RenderDelegate(const CefString& name)
14 | : bridge_object_name_(name)
15 | {}
16 |
17 | void
18 | RenderDelegate::OnWebKitInitialized(CefRefPtr app)
19 | {
20 | CefMessageRouterConfig config;
21 | config.js_query_function = QCEF_QUERY_NAME;
22 | config.js_cancel_function = QCEF_QUERY_CANCEL_NAME;
23 | render_message_router_ = CefMessageRouterRendererSide::Create(config);
24 | }
25 |
26 | void
27 | RenderDelegate::OnContextCreated(CefRefPtr app,
28 | CefRefPtr browser,
29 | CefRefPtr frame,
30 | CefRefPtr context)
31 | {
32 | render_message_router_->OnContextCreated(browser, frame, context);
33 |
34 | int64 frameId = frame->GetIdentifier();
35 | auto it = frame_id_to_client_map_.find(frameId);
36 | if (it == frame_id_to_client_map_.end()) {
37 | // create and insert the QCefClient Object into this frame.window object
38 | CefRefPtr objWindow = context->GetGlobal();
39 | CefRefPtr objClient = new QCefClient(browser, frame);
40 | if (bridge_object_name_.empty())
41 | bridge_object_name_ = QCEF_OBJECT_NAME;
42 |
43 | objWindow->SetValue(bridge_object_name_, objClient->GetObject(), V8_PROPERTY_ATTRIBUTE_READONLY);
44 | frame_id_to_client_map_[frameId] = objClient;
45 | }
46 | }
47 |
48 | void
49 | RenderDelegate::OnContextReleased(CefRefPtr app,
50 | CefRefPtr browser,
51 | CefRefPtr frame,
52 | CefRefPtr context)
53 | {
54 | render_message_router_->OnContextReleased(browser, frame, context);
55 |
56 | int64 frameId = frame->GetIdentifier();
57 | auto it = frame_id_to_client_map_.find(frameId);
58 | if (it != frame_id_to_client_map_.end()) {
59 | frame_id_to_client_map_.erase(it);
60 | }
61 | }
62 |
63 | bool
64 | RenderDelegate::OnProcessMessageReceived(CefRefPtr app,
65 | CefRefPtr browser,
66 | CefRefPtr frame,
67 | CefProcessId source_process,
68 | CefRefPtr message)
69 | {
70 | if (render_message_router_->OnProcessMessageReceived(browser, frame, source_process, message)) {
71 | return true;
72 | }
73 |
74 | if (OnTriggerEventNotifyMessage(browser, frame, source_process, message)) {
75 | return true;
76 | }
77 |
78 | return false;
79 | }
80 |
81 | bool
82 | RenderDelegate::OnTriggerEventNotifyMessage(CefRefPtr browser,
83 | CefRefPtr frame,
84 | CefProcessId source_process,
85 | CefRefPtr message)
86 | {
87 | if (message->GetName() == TRIGGEREVENT_NOTIFY_MESSAGE) {
88 | CefRefPtr messageArguments = message->GetArgumentList();
89 | if (messageArguments && (messageArguments->GetSize() >= 2)) {
90 | int idx = 0;
91 | if (CefValueType::VTYPE_STRING == messageArguments->GetType(idx)) {
92 | CefString eventName = messageArguments->GetString(idx++);
93 |
94 | if (CefValueType::VTYPE_DICTIONARY == messageArguments->GetType(idx)) {
95 | CefRefPtr dict = messageArguments->GetDictionary(idx++);
96 |
97 | ExecuteEventListener(browser, frame, eventName, dict);
98 | return true;
99 | }
100 | }
101 | }
102 | }
103 |
104 | return false;
105 | }
106 |
107 | void
108 | RenderDelegate::ExecuteEventListener(CefRefPtr browser,
109 | CefRefPtr frame,
110 | const CefString& name,
111 | CefRefPtr dict)
112 | {
113 | if (browser && frame) {
114 | int64 frameId = frame->GetIdentifier();
115 | auto it = frame_id_to_client_map_.find(frameId);
116 | if (it != frame_id_to_client_map_.end()) {
117 | const CefRefPtr& objClient = it->second;
118 | objClient->ExecuteEventListener(name, dict);
119 | }
120 | }
121 | }
122 |
123 | }
124 |
--------------------------------------------------------------------------------
/src/QCefView/CefViewBrowserApp/SchemeHandlers/QCefViewDefaultSchemeHandler.cpp:
--------------------------------------------------------------------------------
1 | #pragma region std_headers
2 | #include
3 | #include
4 | #pragma endregion std_headers
5 |
6 | #pragma region cef_headers
7 | #include
8 | #include
9 | #include
10 | #include
11 | #include
12 | #include
13 | #include
14 | #include
15 | #pragma endregion cef_headers
16 |
17 | #include "QCefViewDefaultSchemeHandler.h"
18 |
19 | namespace QCefViewDefaultSchemeHandler {
20 | //////////////////////////////////////////////////////////////////////////
21 | // handler
22 | SchemeHandler::SchemeHandler(QCefViewDelegate* pDelegate)
23 | : pQCefViewDelegate_(pDelegate)
24 | , offset_(0)
25 | {}
26 |
27 | bool
28 | SchemeHandler::Open(CefRefPtr request, bool& handle_request, CefRefPtr callback)
29 | {
30 | handle_request = false;
31 | if (pQCefViewDelegate_) {
32 | CefString cefStrUrl = request->GetURL();
33 | pQCefViewDelegate_->onQCefUrlRequest(cefStrUrl);
34 | }
35 |
36 | // no matter whether we have found the handler or not,
37 | // we don't response this request.
38 | return false;
39 | }
40 |
41 | bool
42 | SchemeHandler::ProcessRequest(CefRefPtr request, CefRefPtr callback)
43 | {
44 | if (pQCefViewDelegate_) {
45 | CefString cefStrUrl = request->GetURL();
46 | pQCefViewDelegate_->onQCefUrlRequest(cefStrUrl);
47 | }
48 |
49 | return false;
50 | }
51 |
52 | void
53 | SchemeHandler::GetResponseHeaders(CefRefPtr response, int64& response_length, CefString& redirectUrl)
54 | {
55 | CEF_REQUIRE_IO_THREAD();
56 | // DCHECK(!data_.empty());
57 | // response->SetMimeType(mime_type_);
58 | // response->SetStatus(200);
59 | //// Set the resulting response length
60 | // response_length = data_.length();
61 | }
62 |
63 | bool
64 | SchemeHandler::Skip(int64 bytes_to_skip, int64& bytes_skipped, CefRefPtr callback)
65 | {
66 | bytes_skipped = -2;
67 | return false;
68 | }
69 |
70 | bool
71 | SchemeHandler::Read(void* data_out, int bytes_to_read, int& bytes_read, CefRefPtr callback)
72 | {
73 | bytes_read = 0;
74 | if (offset_ < data_.length()) {
75 | // Copy the next block of data into the buffer.
76 | int transfer_size = min(bytes_to_read, static_cast(data_.length() - offset_));
77 | memcpy(data_out, data_.c_str() + offset_, transfer_size);
78 | offset_ += transfer_size;
79 | bytes_read = transfer_size;
80 | }
81 |
82 | return bytes_read > 0;
83 | }
84 |
85 | bool
86 | SchemeHandler::ReadResponse(void* data_out, int bytes_to_read, int& bytes_read, CefRefPtr callback)
87 | {
88 | bytes_read = -2;
89 | return false;
90 | }
91 |
92 | void
93 | SchemeHandler::Cancel()
94 | {}
95 |
96 | std::map SchemeHandlerFactory::mapBrowser2Delegate_;
97 |
98 | std::mutex SchemeHandlerFactory::mtxMap_;
99 |
100 | void
101 | SchemeHandlerFactory::recordBrowserAndDelegate(CefRefPtr browser, QCefViewDelegate* pDelegate)
102 | {
103 | if (!browser)
104 | return;
105 |
106 | std::lock_guard lock(mtxMap_);
107 | mapBrowser2Delegate_[browser.get()] = pDelegate;
108 | }
109 |
110 | void
111 | SchemeHandlerFactory::removeBrowserAndDelegate(CefRefPtr browser)
112 | {
113 | std::lock_guard lock(mtxMap_);
114 | if (mapBrowser2Delegate_.count(browser.get()))
115 | mapBrowser2Delegate_.erase(browser.get());
116 | }
117 |
118 | //////////////////////////////////////////////////////////////////////////
119 | // handler factory
120 | //
121 |
122 | CefRefPtr
123 | SchemeHandlerFactory::Create(CefRefPtr browser,
124 | CefRefPtr frame,
125 | const CefString& scheme_name,
126 | CefRefPtr request)
127 | {
128 | QCefViewDelegate* pDelegate = nullptr;
129 |
130 | {
131 | std::lock_guard lock(mtxMap_);
132 | if (mapBrowser2Delegate_.count(browser.get()))
133 | pDelegate = mapBrowser2Delegate_[browser.get()];
134 | }
135 |
136 | if (pDelegate)
137 | return new SchemeHandler(pDelegate);
138 | else
139 | return nullptr;
140 | }
141 |
142 | //////////////////////////////////////////////////////////////////////////
143 | bool
144 | RegisterScheme(CefRawPtr registrar)
145 | {
146 | return registrar->AddCustomScheme(scheme_name, 0);
147 | }
148 |
149 | bool
150 | RegisterSchemeHandlerFactory()
151 | {
152 | return CefRegisterSchemeHandlerFactory(scheme_name, "", new SchemeHandlerFactory());
153 | }
154 | }
155 |
--------------------------------------------------------------------------------
/src/QCefWing/CefViewRenderApp/QCefViewRenderApp.cpp:
--------------------------------------------------------------------------------
1 | #pragma region std_headers
2 | #include
3 | #pragma endregion std_headers
4 |
5 | #pragma region cef_headers
6 | #include
7 | #include
8 | #include
9 | #pragma endregion cef_headers
10 |
11 | #pragma region project_headers
12 | #include "QCefViewRenderApp.h"
13 | #include "RenderDelegates/QCefViewDefaultRenderDelegate.h"
14 | #pragma endregion project_headers
15 |
16 | QCefViewRenderApp::QCefViewRenderApp(const CefString& name)
17 | : bridge_object_name_(name)
18 | {
19 | QCefViewDefaultRenderDelegate::CreateBrowserDelegate(render_delegates_, bridge_object_name_);
20 | }
21 |
22 | QCefViewRenderApp::~QCefViewRenderApp() {}
23 |
24 | //////////////////////////////////////////////////////////////////////////
25 | void
26 | QCefViewRenderApp::OnBeforeCommandLineProcessing(const CefString& process_type, CefRefPtr command_line)
27 | {}
28 |
29 | void
30 | QCefViewRenderApp::OnRegisterCustomSchemes(CefRawPtr registrar)
31 | {}
32 |
33 | CefRefPtr
34 | QCefViewRenderApp::GetRenderProcessHandler()
35 | {
36 | return this;
37 | }
38 |
39 | CefRefPtr
40 | QCefViewRenderApp::GetResourceBundleHandler()
41 | {
42 | return nullptr;
43 | }
44 |
45 | CefRefPtr
46 | QCefViewRenderApp::GetBrowserProcessHandler()
47 | {
48 | return nullptr;
49 | }
50 |
51 | //////////////////////////////////////////////////////////////////////////
52 | void
53 | QCefViewRenderApp::OnWebKitInitialized()
54 | {
55 | CEF_REQUIRE_RENDERER_THREAD();
56 |
57 | RenderDelegateSet::iterator it = render_delegates_.begin();
58 | for (; it != render_delegates_.end(); ++it)
59 | (*it)->OnWebKitInitialized(this);
60 | }
61 |
62 | void
63 | QCefViewRenderApp::OnBrowserCreated(CefRefPtr browser, CefRefPtr extra_info)
64 | {
65 | CEF_REQUIRE_RENDERER_THREAD();
66 | RenderDelegateSet::iterator it = render_delegates_.begin();
67 | for (; it != render_delegates_.end(); ++it)
68 | (*it)->OnBrowserCreated(this, browser, extra_info);
69 | }
70 |
71 | void
72 | QCefViewRenderApp::OnBrowserDestroyed(CefRefPtr browser)
73 | {
74 | CEF_REQUIRE_RENDERER_THREAD();
75 | RenderDelegateSet::iterator it = render_delegates_.begin();
76 | for (; it != render_delegates_.end(); ++it)
77 | (*it)->OnBrowserDestroyed(this, browser);
78 | }
79 |
80 | CefRefPtr
81 | QCefViewRenderApp::GetLoadHandler()
82 | {
83 | CefRefPtr load_handler;
84 | RenderDelegateSet::iterator it = render_delegates_.begin();
85 | for (; it != render_delegates_.end() && !load_handler.get(); ++it)
86 | load_handler = (*it)->GetLoadHandler(this);
87 |
88 | return load_handler;
89 | }
90 |
91 | void
92 | QCefViewRenderApp::OnContextCreated(CefRefPtr browser,
93 | CefRefPtr frame,
94 | CefRefPtr context)
95 | {
96 | CEF_REQUIRE_RENDERER_THREAD();
97 |
98 | RenderDelegateSet::iterator it = render_delegates_.begin();
99 | for (; it != render_delegates_.end(); ++it)
100 | (*it)->OnContextCreated(this, browser, frame, context);
101 | }
102 |
103 | void
104 | QCefViewRenderApp::OnContextReleased(CefRefPtr browser,
105 | CefRefPtr frame,
106 | CefRefPtr context)
107 | {
108 | CEF_REQUIRE_RENDERER_THREAD();
109 | RenderDelegateSet::iterator it = render_delegates_.begin();
110 | for (; it != render_delegates_.end(); ++it)
111 | (*it)->OnContextReleased(this, browser, frame, context);
112 | }
113 |
114 | void
115 | QCefViewRenderApp::OnUncaughtException(CefRefPtr browser,
116 | CefRefPtr frame,
117 | CefRefPtr context,
118 | CefRefPtr exception,
119 | CefRefPtr