From b67ded990fa8b1abbf9be9a235553a335b098607 Mon Sep 17 00:00:00 2001 From: wangguoliang Date: Fri, 8 Dec 2023 08:25:19 +0800 Subject: [PATCH] fixed f2401eb from https://gitee.com/wang-guoliang80553691/arkui_ace_engine/pulls/23155 RichText code Signed-off-by: wangguoliang --- .../bridge/declarative_frontend/BUILD.gn | 14 ++++----- .../engine/jsi/jsi_view_register_impl_ng.cpp | 2 -- .../core/components_ng/pattern/web/BUILD.gn | 1 + .../web/cross_platform/web_delegate_cross.cpp | 29 +++++++++++++++++-- .../web/cross_platform/web_pattern.cpp | 6 ++++ .../pattern/web/cross_platform/web_pattern.h | 9 ++++++ .../pattern/web/richtext_model_ng.cpp | 18 ++++++++++++ .../pattern/web/richtext_model_ng.h | 3 ++ 8 files changed, 69 insertions(+), 13 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/BUILD.gn b/frameworks/bridge/declarative_frontend/BUILD.gn index 0c6f6055a45..ca55b686720 100644 --- a/frameworks/bridge/declarative_frontend/BUILD.gn +++ b/frameworks/bridge/declarative_frontend/BUILD.gn @@ -835,15 +835,11 @@ template("declarative_js_engine_ng") { if (defined(config.web_components_support) && config.web_components_support) { - if (!is_arkui_x) { - sources += [ - "jsview/js_richtext.cpp", - "jsview/js_web.cpp", - "jsview/js_web_controller.cpp", - ] - } else { - sources += [ "jsview/js_web.cpp" ] - } + sources += [ + "jsview/js_richtext.cpp", + "jsview/js_web.cpp", + "jsview/js_web_controller.cpp", + ] } if (defined(config.remote_window_support) && config.remote_window_support) { diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register_impl_ng.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register_impl_ng.cpp index c4566e9b69c..8649dd065b7 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register_impl_ng.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register_impl_ng.cpp @@ -428,9 +428,7 @@ void JsBindViews(BindingTarget globalObj) JSPlugin::JSBind(globalObj); #endif #ifdef WEB_SUPPORTED -#if !defined(ANDROID_PLATFORM) && !defined(IOS_PLATFORM) JSRichText::JSBind(globalObj); -#endif JSWeb::JSBind(globalObj); #endif #ifdef REMOTE_WINDOW_SUPPORTED diff --git a/frameworks/core/components_ng/pattern/web/BUILD.gn b/frameworks/core/components_ng/pattern/web/BUILD.gn index 8db51dd1c15..5e2baffee5c 100644 --- a/frameworks/core/components_ng/pattern/web/BUILD.gn +++ b/frameworks/core/components_ng/pattern/web/BUILD.gn @@ -36,6 +36,7 @@ build_component_ng("web_pattern_ng") { "cross_platform/web_delegate_cross.cpp", "cross_platform/web_pattern.cpp", "cross_platform/web_resource.cpp", + "richtext_model_ng.cpp", "web_accessibility_property.cpp", "web_layout_algorithm.cpp", "web_model_ng.cpp", diff --git a/frameworks/core/components_ng/pattern/web/cross_platform/web_delegate_cross.cpp b/frameworks/core/components_ng/pattern/web/cross_platform/web_delegate_cross.cpp index 5ce1469eb9f..281b8ece92c 100644 --- a/frameworks/core/components_ng/pattern/web/cross_platform/web_delegate_cross.cpp +++ b/frameworks/core/components_ng/pattern/web/cross_platform/web_delegate_cross.cpp @@ -113,6 +113,7 @@ constexpr char NTC_PARAM_URL[] = "url"; constexpr char NTC_PARAM_PAGE_URL[] = "pageUrl"; constexpr char NTC_PARAM_PAGE_INVALID[] = "pageInvalid"; constexpr char NTC_PARAM_DESCRIPTION[] = "description"; +constexpr char NTC_PARAM_RICH_TEXT_INIT[] = "richTextInit"; constexpr char WEB_ERROR_CODE_CREATEFAIL[] = "error-web-delegate-000001"; constexpr char WEB_ERROR_MSG_CREATEFAIL[] = "create web_delegate failed."; @@ -142,6 +143,8 @@ const char WEB_PARAM_BEGIN[] = "#HWJS-?-#"; const char WEB_METHOD[] = "method"; const char WEB_EVENT[] = "event"; const char WEB_RESULT_FAIL[] = "fail"; +constexpr char MIMETYPE[] = "text/html"; +constexpr char ENCODING[] = "UTF-8"; constexpr int FONT_MIN_SIZE = 1; constexpr int FONT_MAX_SIZE = 72; @@ -685,7 +688,8 @@ void WebDelegateCross::CreatePluginResource( << WEB_PARAM_EQUALS << position.GetX() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_TOP << WEB_PARAM_EQUALS << position.GetY() * context->GetViewScale() << WEB_PARAM_AND << NTC_PARAM_SRC << WEB_PARAM_EQUALS << webPattern->GetWebSrc().value_or("") << WEB_PARAM_AND << NTC_PARAM_PAGE_URL - << WEB_PARAM_EQUALS << pageUrl; + << WEB_PARAM_EQUALS << pageUrl << WEB_PARAM_AND << NTC_PARAM_RICH_TEXT_INIT << WEB_PARAM_EQUALS + << webPattern->GetRichTextInit(); std::string param = paramStream.str(); webDelegate->id_ = resRegister->CreateResource(WEB_CREATE, param); @@ -1657,7 +1661,28 @@ void WebDelegateCross::LoadUrl() {} bool WebDelegateCross::LoadDataWithRichText() -{} +{ + auto webPattern = webPattern_.Upgrade(); + CHECK_NULL_RETURN(webPattern, false); + auto webData = webPattern->GetWebData(); + CHECK_NULL_RETURN(webData, false); + const std::string& data = webData.value(); + if (data.empty()) { + return false; + } + hash_ = MakeResourceHash(); + loadDataMethod_ = MakeMethodHash(WEB_METHOD_LOAD_DATA); + std::stringstream paramStream; + paramStream << NTC_PARAM_LOADDATA_DATA << WEB_PARAM_EQUALS + << data.c_str() << WEB_PARAM_AND + << NTC_PARAM_LOADDATA_MIMETYPE << WEB_PARAM_EQUALS + << MIMETYPE << WEB_PARAM_AND + << NTC_PARAM_LOADDATA_ENCODING << WEB_PARAM_EQUALS + << ENCODING; + std::string param = paramStream.str(); + CallResRegisterMethod(loadDataMethod_, param, nullptr); + return true; +} void WebDelegateCross::SetBackgroundColor(int32_t backgroundColor) {} diff --git a/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.cpp b/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.cpp index 2dd4689858f..c903045b525 100644 --- a/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.cpp +++ b/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.cpp @@ -900,6 +900,12 @@ bool WebPattern::OnDirtyLayoutWrapperSwap(const RefPtr& dirty, co drawSizeCache_ = drawSize_; auto offset = Offset(GetCoordinatePoint()->GetX(), GetCoordinatePoint()->GetY()); delegate_->SetBoundsOrResize(drawSize_, offset); + if (!isUrlLoaded_) { + isUrlLoaded_ = true; + if (webData_) { + delegate_->LoadDataWithRichText(); + } + } return false; } diff --git a/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.h b/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.h index b3d4a8fc644..e6e74d54726 100644 --- a/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.h +++ b/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.h @@ -353,6 +353,14 @@ public: { return rootLayerHeight_; } + void RichTextInit() + { + richTextInit_ = true; + } + bool GetRichTextInit() const + { + return richTextInit_; + } private: void RegistVirtualKeyBoardListener(); @@ -530,6 +538,7 @@ private: WebLayoutMode layoutMode_ = WebLayoutMode::NONE; int32_t rootLayerWidth_ = 0; int32_t rootLayerHeight_ = 0; + bool richTextInit_ = false; ACE_DISALLOW_COPY_AND_MOVE(WebPattern); }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/web/richtext_model_ng.cpp b/frameworks/core/components_ng/pattern/web/richtext_model_ng.cpp index d397baaea0c..018fffbec75 100644 --- a/frameworks/core/components_ng/pattern/web/richtext_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/web/richtext_model_ng.cpp @@ -18,7 +18,11 @@ #include "core/components_ng/base/view_abstract.h" #include "core/components_ng/base/view_stack_processor.h" #include "core/components_ng/pattern/web/web_event_hub.h" +#if !defined(ANDROID_PLATFORM) && !defined(IOS_PLATFORM) #include "core/components_ng/pattern/web/web_pattern.h" +#else +#include "core/components_ng/pattern/web/cross_platform/web_pattern.h" +#endif #include "core/components_v2/inspector/inspector_constants.h" #include "core/pipeline_ng/pipeline_context.h" @@ -34,7 +38,11 @@ void RichTextModelNG::Create(const std::string& webData) auto webPattern = frameNode->GetPattern(); CHECK_NULL_VOID(webPattern); +#ifdef ANDROID_PLATFORM + webPattern->RichTextInit(); +#endif webPattern->SetWebData(webData); + isDataEmpty_ = webData.empty(); auto pipeline = NG::PipelineContext::GetCurrentContext(); CHECK_NULL_VOID(pipeline); pipeline->AddWindowStateChangedCallback(nodeId); @@ -43,6 +51,11 @@ void RichTextModelNG::Create(const std::string& webData) void RichTextModelNG::SetOnPageStart(std::function&& onPageStarted) { +#ifdef IOS_PLATFORM + if (isDataEmpty_) { + return; + } +#endif auto func = onPageStarted; auto onPageStartedEvent = [func](const std::shared_ptr& info) { func(info.get()); }; auto webEventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub(); @@ -52,6 +65,11 @@ void RichTextModelNG::SetOnPageStart(std::function&& void RichTextModelNG::SetOnPageFinish(std::function&& onPageFinish) { +#ifdef IOS_PLATFORM + if (isDataEmpty_) { + return; + } +#endif auto func = onPageFinish; auto onPageFinishEvent = [func](const std::shared_ptr& info) { func(info.get()); }; auto webEventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub(); diff --git a/frameworks/core/components_ng/pattern/web/richtext_model_ng.h b/frameworks/core/components_ng/pattern/web/richtext_model_ng.h index d0011a65f6a..d434af0551d 100644 --- a/frameworks/core/components_ng/pattern/web/richtext_model_ng.h +++ b/frameworks/core/components_ng/pattern/web/richtext_model_ng.h @@ -24,6 +24,9 @@ public: void Create(const std::string&) override; void SetOnPageStart(std::function&& onStarted) override; void SetOnPageFinish(std::function&& onFinish) override; + +private: + bool isDataEmpty_ = true; }; } // namespace OHOS::Ace::NG #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_WEB_RICHTEXT_MODEL_NG_H -- Gitee