From a8e59d19f6833e136a37dd3db13a2cd9e3ecc765 Mon Sep 17 00:00:00 2001 From: xiongjun_gitee Date: Thu, 2 Jan 2025 14:46:57 +0800 Subject: [PATCH] add onScroll ndk interface Signed-off-by: xiongjun_gitee --- ohos_nweb/src/capi/arkweb_model.h | 3 +++ ohos_nweb/src/capi/arkweb_type.h | 9 ++++++++ ohos_nweb/src/cef_delegate/nweb_delegate.cc | 9 ++++++++ ohos_nweb/src/cef_delegate/nweb_delegate.h | 2 ++ .../src/cef_delegate/nweb_render_handler.cc | 9 ++++++++ .../src/cef_delegate/nweb_render_handler.h | 3 +++ ohos_nweb/src/ndk/arkweb_model.cc | 23 +++++++++++++++++++ ohos_nweb/src/ndk/arkweb_native_object.cc | 16 +++++++++++++ ohos_nweb/src/ndk/arkweb_native_object.h | 6 +++++ ohos_nweb/src/nweb_delegate_interface.h | 1 + ohos_nweb/src/nweb_impl.cc | 8 +++++++ ohos_nweb/src/nweb_impl.h | 1 + 12 files changed, 90 insertions(+) diff --git a/ohos_nweb/src/capi/arkweb_model.h b/ohos_nweb/src/capi/arkweb_model.h index b8b97a9e21..bbbca0b397 100644 --- a/ohos_nweb/src/capi/arkweb_model.h +++ b/ohos_nweb/src/capi/arkweb_model.h @@ -82,6 +82,9 @@ void OH_ArkWeb_OnPageEnd(const char* webTag, void OH_ArkWeb_OnDestroy(const char* webTag, ArkWeb_OnComponentCallback callback, void* userData); +void OH_ArkWeb_OnScroll(const char* webTag, + ArkWeb_OnScrollCallback callback, + void* userData); void OH_ArkWeb_RegisterAsyncJavaScriptProxy( const char* webTag, const ArkWeb_ProxyObject* proxyObject); diff --git a/ohos_nweb/src/capi/arkweb_type.h b/ohos_nweb/src/capi/arkweb_type.h index f8296028da..23939a5d1a 100644 --- a/ohos_nweb/src/capi/arkweb_type.h +++ b/ohos_nweb/src/capi/arkweb_type.h @@ -132,6 +132,13 @@ typedef ArkWeb_JavaScriptValuePtr (*ArkWeb_OnJavaScriptProxyCallbackWithResult)( */ typedef void (*ArkWeb_OnComponentCallback)(const char* webTag, void* userData); +/** + * @brief Defines the scroll callback of the native ArkWeb. + * + * @since 16 + */ +typedef void (*ArkWeb_OnScrollCallback)(const char* webTag, void* userData, double x, double y); + /** * @brief Defines the ArkWeb_WebMessagePort that represent a HTML5 message port. * @@ -329,6 +336,8 @@ typedef struct { void (*onPageEnd)(const char* webTag, ArkWeb_OnComponentCallback callback, void* userData); /** Register the OnDestroy callback. */ void (*onDestroy)(const char* webTag, ArkWeb_OnComponentCallback callback, void* userData); + /** Register the OnScroll callback. */ + void (*onScroll)(const char* webTag, ArkWeb_OnScrollCallback callback, void* userData); } ArkWeb_ComponentAPI; /** diff --git a/ohos_nweb/src/cef_delegate/nweb_delegate.cc b/ohos_nweb/src/cef_delegate/nweb_delegate.cc index 52f88b64c7..393d82fdc8 100644 --- a/ohos_nweb/src/cef_delegate/nweb_delegate.cc +++ b/ohos_nweb/src/cef_delegate/nweb_delegate.cc @@ -2287,6 +2287,15 @@ void NWebDelegate::RegisterNativeLoadEndCallback( } } +void NWebDelegate::RegisterNativeScrollCallback( + std::function&& callback) { + if (render_handler_ != nullptr) { + render_handler_->RegisterNativeScrollCallback(std::move(callback)); + } else { + LOG(ERROR) << "render_handler_ is nullptr"; + } +} + void NWebDelegate::JavaScriptOnDocumentStart(const ScriptItems& scriptItems) { if (GetBrowser() != nullptr && GetBrowser()->GetHost() != nullptr) { GetBrowser()->GetHost()->RemoveJavaScriptOnDocumentStart(); diff --git a/ohos_nweb/src/cef_delegate/nweb_delegate.h b/ohos_nweb/src/cef_delegate/nweb_delegate.h index 8e8cf8f712..cfb319e83f 100644 --- a/ohos_nweb/src/cef_delegate/nweb_delegate.h +++ b/ohos_nweb/src/cef_delegate/nweb_delegate.h @@ -184,6 +184,8 @@ class NWebDelegate : public NWebDelegateInterface, public virtual CefRefCount { std::function&& callback) override; void RegisterNativeLoadEndCallback( std::function&& callback) override; + void RegisterNativeScrollCallback( + std::function&& callback) override; #ifdef OHOS_ARKWEB_ADBLOCK void UpdateAdblockEasyListRules( diff --git a/ohos_nweb/src/cef_delegate/nweb_render_handler.cc b/ohos_nweb/src/cef_delegate/nweb_render_handler.cc index 0333743468..7ff4e64a3a 100644 --- a/ohos_nweb/src/cef_delegate/nweb_render_handler.cc +++ b/ohos_nweb/src/cef_delegate/nweb_render_handler.cc @@ -278,6 +278,11 @@ CefRefPtr NWebRenderHandler::Create() { return renderHandler; } +void NWebRenderHandler::RegisterNativeScrollCallback( + std::function&& callback) { + on_scroll_cb_ = std::move(callback); +} + void NWebRenderHandler::RegisterRenderCb( std::function render_update_cb) { render_update_cb_ = render_update_cb; @@ -595,6 +600,10 @@ void NWebRenderHandler::OnScrollOffsetChanged(CefRefPtr browser, handler->OnScroll(x, y); } + if (on_scroll_cb_) { + on_scroll_cb_(x, y); + } + ResSchedClientAdapter::ReportScene(ResSchedStatusAdapter::WEB_SCENE_ENTER, ResSchedSceneAdapter::SLIDE); } diff --git a/ohos_nweb/src/cef_delegate/nweb_render_handler.h b/ohos_nweb/src/cef_delegate/nweb_render_handler.h index 706e29bd00..3004dd9d82 100644 --- a/ohos_nweb/src/cef_delegate/nweb_render_handler.h +++ b/ohos_nweb/src/cef_delegate/nweb_render_handler.h @@ -51,6 +51,7 @@ class NWebRenderHandler : public CefRenderHandler { NWebRenderHandler() = default; ~NWebRenderHandler() = default; + void RegisterNativeScrollCallback(std::function&& callback); void RegisterRenderCb(std::function render_update_cb); void RegisterNWebHandler(std::shared_ptr handler); void Resize(uint32_t width, uint32_t height); @@ -286,6 +287,8 @@ class NWebRenderHandler : public CefRenderHandler { #endif // defined(OHOS_INPUT_EVENTS) bool isSystemKeyboard_ = true; bool gesture_event_result_ = false; + + std::function on_scroll_cb_ = nullptr; }; } // namespace OHOS::NWeb diff --git a/ohos_nweb/src/ndk/arkweb_model.cc b/ohos_nweb/src/ndk/arkweb_model.cc index 809188496f..b8c95b0a0e 100644 --- a/ohos_nweb/src/ndk/arkweb_model.cc +++ b/ohos_nweb/src/ndk/arkweb_model.cc @@ -255,6 +255,29 @@ NO_SANITIZE("cfi-icall") ARKWEB_NDK_EXPORT void OH_ArkWeb_OnDestroy(const char* }); } +NO_SANITIZE("cfi-icall") ARKWEB_NDK_EXPORT void OH_ArkWeb_OnScroll(const char* webTag, + ArkWeb_OnScrollCallback callback, + void* userData) { + if (callback == nullptr) { + LOG(ERROR) << "NativeArkWeb OnScroll callback is nullptr"; + return; + } + auto webObjectPtr = + OHOS::NWeb::ArkWebNativeObject::GetWebInstanceByWebTag(webTag); + if (!webObjectPtr) { + LOG(ERROR) << "NativeArkWeb web object pointer is nullptr"; + return; + } + webObjectPtr->SetScrollCallback( + [cb = callback, webTag = std::string(webTag), userData](double x, double y) { + if (!cb) { + LOG(ERROR) << "NativeArkWeb OnScroll callback is nullptr"; + return; + } + cb(webTag.c_str(), userData, x, y); + }); +} + ARKWEB_NDK_EXPORT void OH_ArkWeb_RegisterAsyncJavaScriptProxy( const char* webTag, const ArkWeb_ProxyObject* proxyObject) { diff --git a/ohos_nweb/src/ndk/arkweb_native_object.cc b/ohos_nweb/src/ndk/arkweb_native_object.cc index cd6a5a56c9..0ef1a73d12 100644 --- a/ohos_nweb/src/ndk/arkweb_native_object.cc +++ b/ohos_nweb/src/ndk/arkweb_native_object.cc @@ -52,6 +52,13 @@ bool ArkWebNativeObject::FireValidCallback() { } }; nwebSharedPtr->RegisterNativeLoadEndCallback(std::move(loadEndCallback)); + + auto scrollCallback = [weak = GetWeakPtr()](double x, double y) { + if (auto webObjectPtr = weak.lock()) { + webObjectPtr->FireScrollCallback(x, y); + } + }; + nwebSharedPtr->RegisterNativeScrollCallback(std::move(scrollCallback)); } else { LOG(ERROR) << "NativeArkWeb nweb shared pointer is nullptr"; } @@ -95,6 +102,15 @@ bool ArkWebNativeObject::FireDestroyCallback() { return true; } +bool ArkWebNativeObject::FireScrollCallback(double x, double y) { + if (!scrollCallback_) { + LOG(WARNING) << "NativeArkWeb scroll callback is nullptr"; + return false; + } + scrollCallback_(x, y); + return true; +} + bool ArkWebNativeObject::SetWebWeakPtr( std::shared_ptr& nwebSharedPtr) { if (!nwebSharedPtr) { diff --git a/ohos_nweb/src/ndk/arkweb_native_object.h b/ohos_nweb/src/ndk/arkweb_native_object.h index abf1168d6a..6bbbc8db02 100644 --- a/ohos_nweb/src/ndk/arkweb_native_object.h +++ b/ohos_nweb/src/ndk/arkweb_native_object.h @@ -26,6 +26,7 @@ class ArkWebNativeObject final : public std::enable_shared_from_this { public: using ArkWebLifeTimeFunc = std::function; + using ArkWebScrollFunc = std::function; explicit ArkWebNativeObject(const char* webTag) : webTag_(webTag) {} ~ArkWebNativeObject() = default; void SetValidCallback(ArkWebLifeTimeFunc&& callback) { @@ -41,9 +42,13 @@ class ArkWebNativeObject final void SetDestroyCallback(ArkWebLifeTimeFunc&& callback) { destroyCallback_ = std::move(callback); } + void SetScrollCallback(ArkWebScrollFunc&& callback) { + scrollCallback_ = std::move(callback); + } bool FireLoadStartCallback(); bool FireLoadEndCallback(); bool FireDestroyCallback(); + bool FireScrollCallback(double x, double y); bool SetWebWeakPtr(std::shared_ptr& nwebSharedPtr); std::shared_ptr GetWebSharedPtr(); std::weak_ptr GetWeakPtr(); @@ -58,6 +63,7 @@ class ArkWebNativeObject final ArkWebLifeTimeFunc loadStartCallback_ = nullptr; ArkWebLifeTimeFunc loadEndCallback_ = nullptr; ArkWebLifeTimeFunc destroyCallback_ = nullptr; + ArkWebScrollFunc scrollCallback_ = nullptr; std::weak_ptr nwebWeakPtr_; }; } // namespace OHOS::NWeb diff --git a/ohos_nweb/src/nweb_delegate_interface.h b/ohos_nweb/src/nweb_delegate_interface.h index 6a6749fb5a..f746a891fe 100644 --- a/ohos_nweb/src/nweb_delegate_interface.h +++ b/ohos_nweb/src/nweb_delegate_interface.h @@ -257,6 +257,7 @@ class NWebDelegateInterface const std::vector& method_list) const = 0; virtual void RegisterNativeLoadStartCallback(std::function&& callback) = 0; virtual void RegisterNativeLoadEndCallback(std::function&& callback) = 0; + virtual void RegisterNativeScrollCallback(std::function&& callback) = 0; virtual void JavaScriptOnDocumentStart(const ScriptItems& ScriptItems) = 0; virtual void JavaScriptOnDocumentEnd(const ScriptItems& ScriptItems) = 0; virtual void CallH5Function( diff --git a/ohos_nweb/src/nweb_impl.cc b/ohos_nweb/src/nweb_impl.cc index 8d08744924..ebb23e7708 100644 --- a/ohos_nweb/src/nweb_impl.cc +++ b/ohos_nweb/src/nweb_impl.cc @@ -1685,6 +1685,14 @@ void NWebImpl::RegisterNativeLoadEndCallback(std::function&& callbac } } +void NWebImpl::RegisterNativeScrollCallback(std::function&& callback) { + if (nweb_delegate_ != nullptr) { + nweb_delegate_->RegisterNativeScrollCallback(std::move(callback)); + } else { + LOG(ERROR) << "nweb_delegate_ is nullptr"; + } +} + void NWebImpl::RegisterArkJSfunction( const std::string& object_name, const std::vector& method_list, diff --git a/ohos_nweb/src/nweb_impl.h b/ohos_nweb/src/nweb_impl.h index ed2e42c775..65137a7c36 100644 --- a/ohos_nweb/src/nweb_impl.h +++ b/ohos_nweb/src/nweb_impl.h @@ -146,6 +146,7 @@ class NWebImpl : public NWeb { void RegisterNativeDestroyCallback(std::function&& callback); void RegisterNativeLoadStartCallback(std::function&& callback); void RegisterNativeLoadEndCallback(std::function&& callback); + void RegisterNativeScrollCallback(std::function&& callback); void RegisterArkJSfunction(const std::string& object_name, const std::vector& method_list, -- Gitee