diff --git a/frameworks/core/components/web/resource/web_client_impl.cpp b/frameworks/core/components/web/resource/web_client_impl.cpp index c86598c0cd7545328745bcc330c1a63e3fc14caa..61397bdd237dc95f00563ba6e7f64494632b39a8 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 6a2757e68520a2c880fd64be027bc41522293b8c..8a99995f67e097b28df2525f406c34e0e016ea0f 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 4f65e87e4fd13794b8b143701472c750297b5ada..e2cb9e1eadfb87da9b00475c531a1c5c348cdfb4 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 46c704d301ac60d91927490e21cf71c968ccb869..f77b00a0099274e8fd8d93dbffc754009f3bc06a 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 a3fc513616cb0f4b7d379ae4d4acd6aa549414ad..4b9469ea090e9f805f45dab183304d37f0fd819b 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 1b3f26dbf5b0d14d2ece4694ab4e4eb18cfb1275..101a65c5ca1d83f7ec352e429ab62c55fda5b365 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) {}