From c134d58ce57cf232473056d0d85f4366dd190176 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B0=B8=E5=87=AF?= Date: Mon, 21 Jul 2025 21:27:09 +0800 Subject: [PATCH] tagInfo_mask_0721 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘永凯 --- adapter/ohos/osal/pixel_map_ohos.cpp | 1 + .../pattern/image/image_pattern.cpp | 72 +++++++++++++++++- .../pattern/image/image_pattern.h | 3 + test/unittest/core/pattern/image/image_base.h | 10 +++ .../pattern/image/image_pattern_test_ng.cpp | 76 +++++++++++++++++++ 5 files changed, 161 insertions(+), 1 deletion(-) diff --git a/adapter/ohos/osal/pixel_map_ohos.cpp b/adapter/ohos/osal/pixel_map_ohos.cpp index 88a4ac4dc1d..289c94e7ef1 100644 --- a/adapter/ohos/osal/pixel_map_ohos.cpp +++ b/adapter/ohos/osal/pixel_map_ohos.cpp @@ -472,6 +472,7 @@ uint32_t PixelMapOhos::GetInnerColorGamut() const void PixelMapOhos::SetMemoryName(std::string pixelMapName) const { CHECK_NULL_VOID(pixmap_); + LOGI("PixelMapOhos::SetMemoryName, %{public}s", pixelMapName.c_str()); pixmap_->SetMemoryName(pixelMapName); } } // namespace OHOS::Ace diff --git a/frameworks/core/components_ng/pattern/image/image_pattern.cpp b/frameworks/core/components_ng/pattern/image/image_pattern.cpp index 19a786512c8..683e524b26b 100644 --- a/frameworks/core/components_ng/pattern/image/image_pattern.cpp +++ b/frameworks/core/components_ng/pattern/image/image_pattern.cpp @@ -15,6 +15,7 @@ #define NAPI_VERSION 8 +#include #include "core/components_ng/pattern/image/image_pattern.h" #if defined(ACE_STATIC) @@ -46,6 +47,9 @@ constexpr uint32_t CRITICAL_TIME = 50; // ms. If show time of image is less constexpr int64_t MICROSEC_TO_MILLISEC = 1000; constexpr int32_t DEFAULT_ITERATIONS = 1; constexpr int32_t MEMORY_LEVEL_CRITICAL_STATUS = 2; +constexpr size_t URL_SAVE_LENGTH = 15; +constexpr int32_t NEED_MASK_INDEX = 3; +constexpr int32_t KERNEL_MAX_LENGTH_EXCEPT_OTHER = 245; std::string GetImageInterpolation(ImageInterpolation interpolation) { @@ -494,13 +498,79 @@ bool ImagePattern::SetPixelMapMemoryName(RefPtr& pixelMap) CHECK_NULL_RETURN(host, false); auto id = host->GetInspectorId(); if (id.has_value()) { - pixelMap->SetMemoryName(id.value()); + std::string result = std::string("id:") + id.value(); + pixelMap->SetMemoryName(result); hasSetPixelMapMemoryName_ = true; return true; } + auto imageLayoutProperty = GetLayoutProperty(); + CHECK_NULL_RETURN(imageLayoutProperty, false); + auto imageSourceInfo = imageLayoutProperty->GetImageSourceInfo(); + CHECK_NULL_RETURN(imageSourceInfo, false); + + if (!imageSourceInfo->GetPixmap()) { + pixelMap->SetMemoryName(HandleSrcForMemoryName()); + } return false; } +std::string ImagePattern::HandleSrcForMemoryName() +{ + auto imageLayoutProperty = GetLayoutProperty(); + CHECK_NULL_RETURN(imageLayoutProperty, ""); + auto imageSourceInfo = imageLayoutProperty->GetImageSourceInfo(); + CHECK_NULL_RETURN(imageSourceInfo, ""); + + std::string url = imageSourceInfo->GetSrc(); + auto imageObj = loadingCtx_->GetImageObject(); + CHECK_NULL_RETURN(imageObj, ""); + auto width = imageObj->GetImageSize().Width(); + auto height = imageObj->GetImageSize().Height(); + std::string urlByLengthCheck = HandleUrlString(url); + std::string result = std::to_string(static_cast(width)) + std::string("*") + + std::to_string(static_cast(height)) + std::string("-") + MaskUrl(urlByLengthCheck); + LOGI("arkui tageInfo: %{public}s", result.c_str()); + return result; +} + +std::string ImagePattern::HandleUrlString(const std::string& url) +{ + if (url.length() <= KERNEL_MAX_LENGTH_EXCEPT_OTHER) { + return url; + } + size_t startPos = std::max(0, static_cast(url.length()) - KERNEL_MAX_LENGTH_EXCEPT_OTHER); + return url.substr(startPos, KERNEL_MAX_LENGTH_EXCEPT_OTHER); +} + +std::string ImagePattern::MaskUrl(const std::string& url) +{ + const size_t urlTotalLength = 2 * URL_SAVE_LENGTH; + const size_t urlLength = url.length(); + if (urlLength < urlTotalLength) { + std::string result = url; + for (size_t i = 2; i < urlLength; i += NEED_MASK_INDEX) { + result[i] = '*'; + } + return result; + } + + const size_t middleLength = urlLength - urlTotalLength; + std::string result; + result.reserve(urlLength); + result.append(url.substr(0, URL_SAVE_LENGTH)); + result.append(middleLength, '*'); + + const std::string& lastPart = url.substr(urlLength - URL_SAVE_LENGTH); + for (size_t i = 0; i < lastPart.length(); ++i) { + if (i % NEED_MASK_INDEX == 2) { + result += '*'; + } else { + result += lastPart[i]; + } + } + return result; +} + bool ImagePattern::CheckIfNeedLayout() { auto host = GetHost(); diff --git a/frameworks/core/components_ng/pattern/image/image_pattern.h b/frameworks/core/components_ng/pattern/image/image_pattern.h index 439bdf01359..8d89ff96e7e 100644 --- a/frameworks/core/components_ng/pattern/image/image_pattern.h +++ b/frameworks/core/components_ng/pattern/image/image_pattern.h @@ -461,6 +461,9 @@ private: void OnImageLoadFail(const std::string& errorMsg, const ImageErrorInfo& errorInfo); void OnImageLoadSuccess(); bool SetPixelMapMemoryName(RefPtr& pixelMap); + std::string HandleSrcForMemoryName(); + std::string HandleUrlString(const std::string& url); + std::string MaskUrl(const std::string& url); void ApplyAIModificationsToImage(); void SetImagePaintConfig(const RefPtr& canvasImage, const RectF& srcRect, const RectF& dstRect, const ImageSourceInfo& sourceInfo, int32_t frameCount = 1); diff --git a/test/unittest/core/pattern/image/image_base.h b/test/unittest/core/pattern/image/image_base.h index 82f15c775a3..8f1d9986b1f 100644 --- a/test/unittest/core/pattern/image/image_base.h +++ b/test/unittest/core/pattern/image/image_base.h @@ -116,6 +116,16 @@ constexpr Dimension IMAGE_TOP = 0.0_vp; constexpr Dimension IMAGE_LEFT = 0.0_vp; const std::vector COLOR_FILTER_NULL; const std::string tagName = "TestNode"; +const std::string URL_LENTH_MORE_THAN_245 = std::string("https://example.com/api/v1/resources?param1=longstring") + +"herewitlotsofcharctersincludinglettersnumbersandhyphens¶m2=anotherverylongparameterthataddsuptothelengthrequire" + +"toreach250characters¶m3=evensomemorespecialcharactersliketildesandunderscores"; +const std::string URL_LENTH_EQUAL_35 = "https://example.com/api/v1/resource"; +const std::string URL_LENTH_LESS_THAN_30 = "https://example.com"; +const std::string RESULT_FOR_URL_LENTH_MORE_THAN_245 = std::string("://example.com/api/v1/resources?") + +"param1=longstringherewitlotsofcharctersincludinglettersnumbersandhyphens¶m2=anotherverylongparameterthatadd" + +"suptothelengthrequiretoreach250characters¶m3=evensomemorespecialcharactersliketildesandunderscores"; +const std::string RESULT_FOR_URL_LENTH_EQUAL_35 = "https://example*****ap*/v*/r*so*rc*"; +const std::string RESULT_FOR_URL_LENTH_LESS_THAN_30 = "ht*ps*//*xa*pl*.c*m"; class ImageBases : public testing::Test { public: diff --git a/test/unittest/core/pattern/image/image_pattern_test_ng.cpp b/test/unittest/core/pattern/image/image_pattern_test_ng.cpp index 2ea8050da3b..f155073934c 100644 --- a/test/unittest/core/pattern/image/image_pattern_test_ng.cpp +++ b/test/unittest/core/pattern/image/image_pattern_test_ng.cpp @@ -2643,6 +2643,82 @@ HWTEST_F(ImagePatternTestNg, TestImageJsonImageWidth_Height01, TestSize.Level0) EXPECT_EQ(imageHeight, 200); } +/** + * @tc.name: HandleUrlString001 + * @tc.desc: Test HandleUrlString for ImagePattern. + * @tc.type: FUNC + */ +HWTEST_F(ImagePatternTestNg, HandleUrlString001, TestSize.Level0) +{ + /** + * @tc.steps: step1. create Image frameNode. + */ + auto frameNode = CreatePixelMapAnimator(2); + EXPECT_NE(frameNode, nullptr); + auto imagePattern = frameNode->GetPattern(); + EXPECT_NE(imagePattern, nullptr); + + std::string result = imagePattern->HandleUrlString(URL_LENTH_MORE_THAN_245); + EXPECT_EQ(result, RESULT_FOR_URL_LENTH_MORE_THAN_245); +} + +/** + * @tc.name: HandleUrlString002 + * @tc.desc: Test HandleUrlString for ImagePattern. + * @tc.type: FUNC + */ +HWTEST_F(ImagePatternTestNg, HandleUrlString002, TestSize.Level0) +{ + /** + * @tc.steps: step1. create Image frameNode. + */ + auto frameNode = CreatePixelMapAnimator(2); + EXPECT_NE(frameNode, nullptr); + auto imagePattern = frameNode->GetPattern(); + EXPECT_NE(imagePattern, nullptr); + + std::string result = imagePattern->HandleUrlString(URL_LENTH_EQUAL_35); + EXPECT_EQ(result, URL_LENTH_EQUAL_35); +} + +/** + * @tc.name: MaskUrl001 + * @tc.desc: Test MaskUrl for ImagePattern. + * @tc.type: FUNC + */ +HWTEST_F(ImagePatternTestNg, MaskUrl001, TestSize.Level0) +{ + /** + * @tc.steps: step1. create Image frameNode. + */ + auto frameNode = CreatePixelMapAnimator(2); + EXPECT_NE(frameNode, nullptr); + auto imagePattern = frameNode->GetPattern(); + EXPECT_NE(imagePattern, nullptr); + + std::string result = imagePattern->MaskUrl(URL_LENTH_EQUAL_35); + EXPECT_EQ(result, RESULT_FOR_URL_LENTH_EQUAL_35); +} + +/** + * @tc.name: MaskUrl002 + * @tc.desc: Test MaskUrl for ImagePattern. + * @tc.type: FUNC + */ +HWTEST_F(ImagePatternTestNg, MaskUrl002, TestSize.Level0) +{ + /** + * @tc.steps: step1. create Image frameNode. + */ + auto frameNode = CreatePixelMapAnimator(2); + EXPECT_NE(frameNode, nullptr); + auto imagePattern = frameNode->GetPattern(); + EXPECT_NE(imagePattern, nullptr); + + std::string result = imagePattern->MaskUrl(URL_LENTH_LESS_THAN_30); + EXPECT_EQ(result, RESULT_FOR_URL_LENTH_LESS_THAN_30); +} + /** * @tc.name: ClearReloadFlagsAfterLoad001 * @tc.desc: Test function for ImagePattern. -- Gitee