From 090294922b1a5687ff27c441d9d6ccbece51d55f Mon Sep 17 00:00:00 2001 From: happy Date: Wed, 25 Jun 2025 17:57:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A3=80=E8=A7=86=E6=84=8F=E8=A7=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: happy Change-Id: Ic3bd4a4ad529cafc3d3a551c985f4a9094bb51a3 --- adapter/ohos/entrance/ace_container.cpp | 2 +- .../ohos/entrance/ace_translate_manager.cpp | 7 +++ .../ui_session/ui_session_manager_ohos.cpp | 59 ++++++++++--------- .../ui_session/ui_session_manager_ohos.h | 2 +- .../core/common/ace_translate_manager.h | 5 +- .../pattern/text/text_pattern.cpp | 32 +++++----- .../inner_api/ui_session/ui_session_manager.h | 6 +- .../ui_session/ui_translate_manager.h | 2 + .../core/pattern/text/text_testeleven_ng.cpp | 34 +++++++++++ 9 files changed, 102 insertions(+), 47 deletions(-) diff --git a/adapter/ohos/entrance/ace_container.cpp b/adapter/ohos/entrance/ace_container.cpp index fe99bdb9f65e..e0bfb3f03386 100644 --- a/adapter/ohos/entrance/ace_container.cpp +++ b/adapter/ohos/entrance/ace_container.cpp @@ -2546,7 +2546,7 @@ void AceContainer::AttachView(std::shared_ptr window, const RefPtrSetCreateTime(createTime_); } resRegister_ = aceView_->GetPlatformResRegister(); - auto uiTranslateManager = std::make_shared(); + auto uiTranslateManager = std::make_shared(taskExecutor_); #ifndef NG_BUILD if (useNewPipeline_) { pipelineContext_ = AceType::MakeRefPtr( diff --git a/adapter/ohos/entrance/ace_translate_manager.cpp b/adapter/ohos/entrance/ace_translate_manager.cpp index eea7d206b55d..e4091a003804 100644 --- a/adapter/ohos/entrance/ace_translate_manager.cpp +++ b/adapter/ohos/entrance/ace_translate_manager.cpp @@ -185,6 +185,13 @@ void UiTranslateManagerImpl::TravelFindPixelMap(RefPtr currentNode) } } +void UiTranslateManagerImpl::PostToUI(const std::function& task) +{ + if (taskExecutor_) { + taskExecutor_->PostTask(task, TaskExecutor::TaskType::UI, "ArkUIHandleUiTranslateManager"); + } +} + void UiTranslateManagerImpl::FindTopNavDestination(RefPtr currentNode, RefPtr& result) { for (const auto& item : currentNode->GetChildren()) { diff --git a/adapter/ohos/entrance/ui_session/ui_session_manager_ohos.cpp b/adapter/ohos/entrance/ui_session/ui_session_manager_ohos.cpp index 04506c6bea06..c1faab249fda 100644 --- a/adapter/ohos/entrance/ui_session/ui_session_manager_ohos.cpp +++ b/adapter/ohos/entrance/ui_session/ui_session_manager_ohos.cpp @@ -18,7 +18,6 @@ namespace OHOS::Ace { std::mutex UiSessionManager::mutex_; std::shared_mutex UiSessionManager::reportObjectMutex_; -std::shared_mutex UiSessionManager::translateManagerMutex_; constexpr int32_t ONCE_IPC_SEND_DATA_MAX_SIZE = 131072; UiSessionManager* UiSessionManager::GetInstance() { @@ -331,21 +330,23 @@ void UiSessionManagerOhos::SaveTranslateManager(std::shared_ptr&& callback) { - std::unique_lock lock(mutex_); + std::unique_lock lock(getInstanceIdCallbackMutex_); getInstanceIdCallback_ = std::move(callback); } void UiSessionManagerOhos::RemoveSaveGetCurrentInstanceId(int32_t instanceId) { + std::unique_lock lock(translateManagerMutex_); translateManagerMap_.erase(instanceId); } std::shared_ptr UiSessionManagerOhos::GetCurrentTranslateManager() { std::shared_ptr currentTranslateManager = nullptr; - + std::shared_lock lock(getInstanceIdCallbackMutex_); if (getInstanceIdCallback_) { int32_t instanceId = getInstanceIdCallback_(); + std::shared_lock lock(translateManagerMutex_); auto iter = translateManagerMap_.find(instanceId); if (iter != translateManagerMap_.end()) { auto translateManager = iter->second; @@ -359,11 +360,11 @@ std::shared_ptr UiSessionManagerOhos::GetCurrentTranslateMan void UiSessionManagerOhos::GetWebViewLanguage() { - std::shared_lock reportLock(translateManagerMutex_); - - auto currentTranslateManager = GetCurrentTranslateManager(); + auto currentTranslateManager = GetCurrentTranslateManager(); if (currentTranslateManager) { - currentTranslateManager->GetWebViewCurrentLanguage(); + currentTranslateManager->PostToUI([currentTranslateManager]() { + currentTranslateManager->GetWebViewCurrentLanguage(); + }); } else { LOGE("translateManager is nullptr ,translate failed"); } @@ -402,7 +403,7 @@ void UiSessionManagerOhos::SaveProcessId(std::string key, int32_t id) void UiSessionManagerOhos::SendCurrentLanguage(std::string result) { - std::shared_lock reportLock(translateManagerMutex_); + std::shared_lock reportLock(reportObjectMutex_); auto reportService = iface_cast(reportObjectMap_[processMap_["translate"]]); if (reportService) { reportService->SendCurrentLanguage(result); @@ -413,9 +414,11 @@ void UiSessionManagerOhos::GetWebTranslateText(std::string extraData, bool isCon { std::shared_lock reportLock(translateManagerMutex_); - auto currentTranslateManager = GetCurrentTranslateManager(); + auto currentTranslateManager = GetCurrentTranslateManager(); if (currentTranslateManager) { - currentTranslateManager->GetTranslateText(extraData, isContinued); + currentTranslateManager->PostToUI([currentTranslateManager, extraData, isContinued]() { + currentTranslateManager->GetTranslateText(extraData, isContinued); + }); } else { LOGE("translateManager is nullptr ,translate failed"); } @@ -423,7 +426,7 @@ void UiSessionManagerOhos::GetWebTranslateText(std::string extraData, bool isCon void UiSessionManagerOhos::SendWebTextToAI(int32_t nodeId, std::string res) { - std::shared_lock reportLock(translateManagerMutex_); + std::shared_lock reportLock(reportObjectMutex_); auto reportService = iface_cast(reportObjectMap_[processMap_["translate"]]); if (reportService != nullptr) { reportService->SendWebText(nodeId, res); @@ -435,11 +438,11 @@ void UiSessionManagerOhos::SendWebTextToAI(int32_t nodeId, std::string res) void UiSessionManagerOhos::SendTranslateResult( int32_t nodeId, std::vector results, std::vector ids) { - std::shared_lock reportLock(translateManagerMutex_); - - auto currentTranslateManager = GetCurrentTranslateManager(); + auto currentTranslateManager = GetCurrentTranslateManager(); if (currentTranslateManager) { - currentTranslateManager->SendTranslateResult(nodeId, results, ids); + currentTranslateManager->PostToUI([currentTranslateManager, nodeId, results, ids]() { + currentTranslateManager->SendTranslateResult(nodeId, results, ids); + }); } else { LOGE("translateManager is nullptr ,translate failed"); } @@ -449,9 +452,11 @@ void UiSessionManagerOhos::SendTranslateResult(int32_t nodeId, std::string res) { std::shared_lock reportLock(translateManagerMutex_); - auto currentTranslateManager = GetCurrentTranslateManager(); + auto currentTranslateManager = GetCurrentTranslateManager(); if (currentTranslateManager) { - currentTranslateManager->SendTranslateResult(nodeId, res); + currentTranslateManager->PostToUI([currentTranslateManager, nodeId, res]() { + currentTranslateManager->SendTranslateResult(nodeId, res); + }); } else { LOGE("translateManager is nullptr ,translate failed"); } @@ -460,10 +465,11 @@ void UiSessionManagerOhos::SendTranslateResult(int32_t nodeId, std::string res) void UiSessionManagerOhos::ResetTranslate(int32_t nodeId) { std::shared_lock reportLock(translateManagerMutex_); - - auto currentTranslateManager = GetCurrentTranslateManager(); + auto currentTranslateManager = GetCurrentTranslateManager(); if (currentTranslateManager) { - currentTranslateManager->ResetTranslate(nodeId); + currentTranslateManager->PostToUI([currentTranslateManager, nodeId]() { + currentTranslateManager->ResetTranslate(nodeId); + }); } else { LOGE("translateManager is nullptr ,translate failed"); } @@ -478,13 +484,10 @@ void UiSessionManagerOhos::GetPixelMap() } } -void UiSessionManagerOhos::SendPixelMap(std::vector>> maps) +void UiSessionManagerOhos::SendPixelMap(const std::vector>>& maps) { - std::shared_lock reportLock(translateManagerMutex_); - std::shared_ptr translateManager = nullptr; - - auto currentTranslateManager = GetCurrentTranslateManager(); - + auto currentTranslateManager = GetCurrentTranslateManager(); + std::shared_lock reportLock(reportObjectMutex_); if (!currentTranslateManager) { LOGW("send pixelMap failed,translateManager is nullptr"); } @@ -492,7 +495,9 @@ void UiSessionManagerOhos::SendPixelMap(std::vectorSendShowingImage(maps); if (currentTranslateManager) { - currentTranslateManager->ClearMap(); + currentTranslateManager->PostToUI([currentTranslateManager]() { + currentTranslateManager->ClearMap(); + }); } } else { LOGW("send pixel maps failed,process id:%{public}d", processMap_["pixel"]); diff --git a/adapter/ohos/entrance/ui_session/ui_session_manager_ohos.h b/adapter/ohos/entrance/ui_session/ui_session_manager_ohos.h index 2ed89035ee0f..1140124eaca2 100644 --- a/adapter/ohos/entrance/ui_session/ui_session_manager_ohos.h +++ b/adapter/ohos/entrance/ui_session/ui_session_manager_ohos.h @@ -72,7 +72,7 @@ public: void SendTranslateResult(int32_t nodeId, std::string res) override; void ResetTranslate(int32_t nodeId) override; void GetPixelMap() override; - void SendPixelMap(std::vector>> maps) override; + void SendPixelMap(const std::vector>>& maps) override; void GetVisibleInspectorTree() override; bool IsHasReportObject() override; void SendCommand(const std::string& command) override; diff --git a/frameworks/core/common/ace_translate_manager.h b/frameworks/core/common/ace_translate_manager.h index b0b476d52486..8da6e1942e1d 100644 --- a/frameworks/core/common/ace_translate_manager.h +++ b/frameworks/core/common/ace_translate_manager.h @@ -15,13 +15,14 @@ #ifndef FOUNDATION_ACE_INTERFACE_UI_CONTENT_PROXY_H #define FOUNDATION_ACE_INTERFACE_UI_CONTENT_PROXY_H - +#include #include "interfaces/inner_api/ui_session/ui_translate_manager.h" #include "frameworks/core/components_ng/base/frame_node.h" namespace OHOS::Ace { class ACE_FORCE_EXPORT UiTranslateManagerImpl : public UiTranslateManager { public: + explicit UiTranslateManagerImpl(const RefPtr& taskExecutor) : taskExecutor_(taskExecutor) {}; void AddTranslateListener(const WeakPtr node); void RemoveTranslateListener(int32_t nodeId); void GetWebViewCurrentLanguage() override; @@ -35,11 +36,13 @@ public: void TravelFindPixelMap(RefPtr currentNode); void AddPixelMap(int32_t nodeId, RefPtr pixelMap); void FindTopNavDestination(RefPtr currentNode, RefPtr& result); + void PostToUI(const std::function& task) override; private: std::map> listenerMap_; std::vector>> pixelMap_; const static std::set layoutTags_; + RefPtr taskExecutor_; }; } // namespace OHOS::Ace #endif // FOUNDATION_ACE_INTERFACE_UI_CONTENT_PROXY_H diff --git a/frameworks/core/components_ng/pattern/text/text_pattern.cpp b/frameworks/core/components_ng/pattern/text/text_pattern.cpp index a4e87f2c2940..c8edc0f6cbf6 100644 --- a/frameworks/core/components_ng/pattern/text/text_pattern.cpp +++ b/frameworks/core/components_ng/pattern/text/text_pattern.cpp @@ -4698,24 +4698,28 @@ void TextPattern::DumpSimplifyInfo(std::unique_ptr& json) { auto textLayoutProp = GetLayoutProperty(); CHECK_NULL_VOID(textLayoutProp); - auto textValue = UtfUtils::Str16DebugToStr8(textLayoutProp->GetContent().value_or(u" ")); - if (!IsSetObscured() && textValue[0] != '\0') { - json->Put("content", textValue.c_str()); - return; - } - - CHECK_NULL_VOID(pManager_); - auto paragraphs = pManager_->GetParagraphs(); - if (paragraphs.empty()) { + if (IsSetObscured()) { + json->Put("content", ""); return; } + auto textValue = UtfUtils::Str16DebugToStr8(textLayoutProp->GetContent().value_or(u"")); + if (!textValue.empty()) { + json->Put("content", textValue.c_str()); + } else { + CHECK_NULL_VOID(pManager_); + auto paragraphs = pManager_->GetParagraphs(); + if (paragraphs.empty()) { + return; + } - for (auto&& info : paragraphs) { - auto paragraph = info.paragraph; - if (paragraph) { - auto text = StringUtils::Str16ToStr8(paragraph->GetParagraphText()); - json->Put("content", text.c_str()); + std::string text; + for (auto&& info : paragraphs) { + auto paragraph = info.paragraph; + if (paragraph) { + text += StringUtils::Str16ToStr8(paragraph->GetParagraphText()); + } } + json->Put("content", text.c_str()); } } diff --git a/interfaces/inner_api/ui_session/ui_session_manager.h b/interfaces/inner_api/ui_session/ui_session_manager.h index 5ca5f5bfa195..4acc699327c1 100644 --- a/interfaces/inner_api/ui_session/ui_session_manager.h +++ b/interfaces/inner_api/ui_session/ui_session_manager.h @@ -145,7 +145,7 @@ public: virtual void SendCommand(const std::string& command) {}; virtual void SaveSendCommandFunction(SendCommandFunction&& function) {}; #if !defined(PREVIEW) && !defined(ACE_UNITTEST) && defined(OHOS_PLATFORM) - virtual void SendPixelMap(std::vector>> maps) {}; + virtual void SendPixelMap(const std::vector>>& maps) {}; #endif virtual void GetVisibleInspectorTree() {}; @@ -174,9 +174,9 @@ protected: std::atomic webTaskNums_ = 0; std::string baseInfo_; std::map> translateManagerMap_; - std::shared_ptr translateManager_ = nullptr; + std::shared_mutex translateManagerMutex_; std::function getInstanceIdCallback_; - static std::shared_mutex translateManagerMutex_; + std::shared_mutex getInstanceIdCallbackMutex_; std::function pipelineContextPageNameCallback_; SendCommandFunction sendCommandFunction_ = 0; }; diff --git a/interfaces/inner_api/ui_session/ui_translate_manager.h b/interfaces/inner_api/ui_session/ui_translate_manager.h index 805b916ffada..afe69fd24b34 100644 --- a/interfaces/inner_api/ui_session/ui_translate_manager.h +++ b/interfaces/inner_api/ui_session/ui_translate_manager.h @@ -16,6 +16,7 @@ #ifndef INTERFACE_INNERAPI_UI_SESSION_UI_TRANSLATE_MANAGER_H #define INTERFACE_INNERAPI_UI_SESSION_UI_TRANSLATE_MANAGER_H #include +#include #include #include "ui_session_json_util.h" @@ -32,6 +33,7 @@ public: virtual void SendTranslateResult(int32_t nodeId, std::string res) {}; virtual void ResetTranslate(int32_t nodeId); virtual void ClearMap(); + virtual void PostToUI(const std::function& task) {}; }; } // namespace OHOS::Ace #endif diff --git a/test/unittest/core/pattern/text/text_testeleven_ng.cpp b/test/unittest/core/pattern/text/text_testeleven_ng.cpp index 19588ad2ee87..1a0c6d49a8b4 100644 --- a/test/unittest/core/pattern/text/text_testeleven_ng.cpp +++ b/test/unittest/core/pattern/text/text_testeleven_ng.cpp @@ -740,6 +740,40 @@ HWTEST_F(TextTestNg, SpanStringGetSubSpanList002, TestSize.Level1) EXPECT_TRUE(result.empty()); } +/** + * @tc.name: DumpSimplifyInfo001 + * @tc.desc: test DumpSimplifyInfo + * @tc.type: FUNC + */ +HWTEST_F(TextTestNg, DumpSimplifyInfo001, TestSize.Level1) +{ + /** + * @tc.steps: step1. init textLayoutProp. + */ + auto frameNode = FrameNode::CreateFrameNode("host", 0, AceType::MakeRefPtr()); + ASSERT_NE(frameNode, nullptr); + auto pattern = frameNode->GetPattern(); + ASSERT_NE(pattern, nullptr); + auto textLayoutProp = pattern->GetLayoutProperty(); + ASSERT_NE(pattern, nullptr); + + /** + * @tc.steps: step2. make !textvalue.empty() true + */ + textLayoutProp->UpdateContent(CREATE_VALUE_W); + + auto json = JsonUtil::CreateSharedPtrJson(); + pattern->DumpSimplifyInfo(json); + + /** + * @tc.steps: step3. verify result + * @expect json is not "" + */ + EXPECT_TRUE(json->Contains("content")); + std::string result = json->ToString(); + EXPECT_EQ(result, "{\"content\":\"Hello World\"}"); +} + /** * @tc.name: SpanStringGetSpan001 * @tc.desc: test GetSpan -- Gitee