From 8f889911c565716415f3c76315b10c3e250f484a Mon Sep 17 00:00:00 2001 From: hw_yang Date: Tue, 24 Jun 2025 17:43:11 +0800 Subject: [PATCH] blankless callback Signed-off-by: hw_yang Change-Id: I61885729263f715f799ade5568937fb726e18bf0 --- .../web/resource/web_client_impl.cpp | 17 +++++++- .../components/web/resource/web_client_impl.h | 3 ++ .../components/web/resource/web_delegate.cpp | 40 ++++++++++++++----- .../components/web/resource/web_delegate.h | 2 + .../components_ng/pattern/web/web_pattern.cpp | 5 +++ .../core/pattern/web/mock_web_delegate.cpp | 2 + 6 files changed, 57 insertions(+), 12 deletions(-) diff --git a/frameworks/core/components/web/resource/web_client_impl.cpp b/frameworks/core/components/web/resource/web_client_impl.cpp index c86598c0cd7..61397bdd237 100644 --- a/frameworks/core/components/web/resource/web_client_impl.cpp +++ b/frameworks/core/components/web/resource/web_client_impl.cpp @@ -925,8 +925,6 @@ void WebClientImpl::OnFirstContentfulPaint(int64_t navigationStartTick, int64_t CHECK_NULL_VOID(delegate); ContainerScope scope(delegate->GetInstanceId()); delegate->OnFirstContentfulPaint(navigationStartTick, firstContentfulPaintMs); - int delayTime = 650; // 650为根据LCP和FCP时差估算的经验值 - delegate->RemoveSnapshotFrameNode(delayTime); } void WebClientImpl::OnFirstMeaningfulPaint( @@ -1453,4 +1451,19 @@ void WebClientImpl::OnPageTitleV2(const std::string &title, bool isRealTitle) ContainerScope scope(delegate->GetInstanceId()); delegate->OnReceivedTitle(title, isRealTitle); } + +void WebClientImpl::OnInsertBlanklessFrame(const std::string& pathToFrame) +{ + auto delegate = webDelegate_.Upgrade(); + CHECK_NULL_VOID(delegate); + // pass directly without any judgment, CreateSnapshotFrameNode will check the parameter + delegate->CreateSnapshotFrameNode(pathToFrame); +} + +void WebClientImpl::OnRemoveBlanklessFrame(int delayTime) +{ + auto delegate = webDelegate_.Upgrade(); + CHECK_NULL_VOID(delegate); + delegate->RemoveSnapshotFrameNode(delayTime); +} } // namespace OHOS::Ace diff --git a/frameworks/core/components/web/resource/web_client_impl.h b/frameworks/core/components/web/resource/web_client_impl.h index 6a2757e6852..8a99995f67e 100644 --- a/frameworks/core/components/web/resource/web_client_impl.h +++ b/frameworks/core/components/web/resource/web_client_impl.h @@ -318,6 +318,9 @@ public: void HideMagnifier() override; void OnPageTitleV2(const std::string &title, bool isRealTitle) override; + + void OnInsertBlanklessFrame(const std::string& pathToFrame) override; + void OnRemoveBlanklessFrame(int delayTime) override; private: std::weak_ptr webviewWeak_; WeakPtr webDelegate_; diff --git a/frameworks/core/components/web/resource/web_delegate.cpp b/frameworks/core/components/web/resource/web_delegate.cpp index 4f65e87e4fd..e2cb9e1eadf 100644 --- a/frameworks/core/components/web/resource/web_delegate.cpp +++ b/frameworks/core/components/web/resource/web_delegate.cpp @@ -108,7 +108,6 @@ constexpr uint32_t DELAY_MILLISECONDS_1000 = 1000; constexpr uint32_t NO_NATIVE_FINGER_TYPE = 100; constexpr uint32_t ACCESSIBILITY_PAGE_CHANGE_DELAY_MILLISECONDS = 100; const std::string DEFAULT_NATIVE_EMBED_ID = "0"; -constexpr uint32_t BLANKLESS_REMOVE_SNAPSHOT_DELAY_TIME = 2000; const std::vector CANONICALENCODINGNAMES = { "Big5", "EUC-JP", "EUC-KR", "GB18030", @@ -5984,6 +5983,32 @@ void WebDelegate::RemoveSnapshotFrameNode(int removeDelayTime) TaskExecutor::TaskType::UI, removeDelayTime, "ArkUIWebSnapshotRemove"); } +void WebDelegate::CreateSnapshotFrameNode(const std::string& snapshotPath) +{ + if (snapshotPath.empty()) { + return; + } + TAG_LOGD(AceLogTag::ACE_WEB, "WebDelegate::CreateSnapshotFrameNode"); + auto context = context_.Upgrade(); + CHECK_NULL_VOID(context); + CHECK_NULL_VOID(context->GetTaskExecutor()); + context->GetTaskExecutor()->PostTask( + [weak = WeakClaim(this), snapshotPath]() { + auto delegate = weak.Upgrade(); + CHECK_NULL_VOID(delegate); + auto webPattern = delegate->webPattern_.Upgrade(); + CHECK_NULL_VOID(webPattern); + webPattern->CreateSnapshotImageFrameNode(snapshotPath); + }, + TaskExecutor::TaskType::UI, "ArkUIWebLoadSnapshot"); +} + +void WebDelegate::SetVisibility(bool isVisible) +{ + CHECK_NULL_VOID(nweb_); + nweb_->SetVisibility(isVisible); +} + bool WebDelegate::OnHandleInterceptLoading(std::shared_ptr request) { CHECK_NULL_RETURN(taskExecutor_, false); @@ -6015,15 +6040,10 @@ bool WebDelegate::OnHandleInterceptLoading(std::shared_ptrUrl(), delegate->nweb_->GetWebId()); - if (!snapshotPath.empty() && request->IsAboutMainFrame()) { - TAG_LOGD(AceLogTag::ACE_WEB, "blankless OnHandleInterceptLoading, snapshot Path:%{public}s", - snapshotPath.c_str()); - auto webPattern = delegate->webPattern_.Upgrade(); - CHECK_NULL_VOID(webPattern); - webPattern->CreateSnapshotImageFrameNode(snapshotPath); - delegate->RemoveSnapshotFrameNode(BLANKLESS_REMOVE_SNAPSHOT_DELAY_TIME); + CHECK_NULL_VOID(delegate->nweb_); + if (request->IsAboutMainFrame()) { + bool ret = delegate->nweb_->TriggerBlanklessForUrl(request->Url()); + TAG_LOGD(AceLogTag::ACE_WEB, "TriggerBlanklessForUrl ret %{public}d", ret); } }, TaskExecutor::TaskType::PLATFORM, "ArkUIWebloadSnapshot"); diff --git a/frameworks/core/components/web/resource/web_delegate.h b/frameworks/core/components/web/resource/web_delegate.h index 46c704d301a..f77b00a0099 100644 --- a/frameworks/core/components/web/resource/web_delegate.h +++ b/frameworks/core/components/web/resource/web_delegate.h @@ -1242,6 +1242,8 @@ public: int GetHitTestResult(); void RemoveSnapshotFrameNode(int removeDelayTime); + void CreateSnapshotFrameNode(const std::string& snapshotPath); + void SetVisibility(bool isVisible); void OnPip(int status, int delegate_id, int child_id, int frame_routing_id, int width, int height); void SetPipNativeWindow(int delegate_id, int child_id, int frame_routing_id, void* window); diff --git a/frameworks/core/components_ng/pattern/web/web_pattern.cpp b/frameworks/core/components_ng/pattern/web/web_pattern.cpp index a3fc513616c..4b9469ea090 100644 --- a/frameworks/core/components_ng/pattern/web/web_pattern.cpp +++ b/frameworks/core/components_ng/pattern/web/web_pattern.cpp @@ -5959,6 +5959,11 @@ void WebPattern::OnVisibleAreaChange(bool isVisible) "WebPattern::OnVisibleAreaChange webId:%{public}d, isVisible:%{public}d, old_isVisible:%{public}d, " "isVisibleActiveEnable:%{public}d, isDialogNested:%{public}d, isFocus:%{public}d", GetWebId(), isVisible, isVisible_, isVisibleActiveEnable_, isDialogNested, isFocus_); + // pass isVisible value to arkweb directly without any judgment + if (delegate_) { + delegate_->SetVisibility(isVisible); + } + if (isVisible_ == isVisible) { return; } diff --git a/test/unittest/core/pattern/web/mock_web_delegate.cpp b/test/unittest/core/pattern/web/mock_web_delegate.cpp index 1b3f26dbf5b..101a65c5ca1 100644 --- a/test/unittest/core/pattern/web/mock_web_delegate.cpp +++ b/test/unittest/core/pattern/web/mock_web_delegate.cpp @@ -1302,6 +1302,8 @@ bool WebDelegate::GetAccessibilityVisible(int64_t accessibilityId) } void WebDelegate::RemoveSnapshotFrameNode(int removeDelayTime) {} +void WebDelegate::CreateSnapshotFrameNode(const std::string& snapshotPath) {} +void WebDelegate::SetVisibility(bool isVisible) {} void WebDelegate::OnPip(int status, int delegate_id, int child_id, int frame_routing_id, int width, int height) {} -- Gitee