diff --git a/libcef/browser/browser_info_manager.cc b/libcef/browser/browser_info_manager.cc index 7a8e1dd5f601b5d6a255519b216914ecfd935052..116f7d9721179e06a37889040397c4cce8951eef 100644 --- a/libcef/browser/browser_info_manager.cc +++ b/libcef/browser/browser_info_manager.cc @@ -25,6 +25,12 @@ #include "content/public/common/child_process_host.h" #include "content/public/common/url_constants.h" +#if defined(OHOS_NO_STATE_PREFETCH) +#include "chrome/browser/preloading/prefetch/no_state_prefetch/no_state_prefetch_manager_factory.h" +#include "components/no_state_prefetch/browser/no_state_prefetch_contents.h" +#include "components/no_state_prefetch/browser/no_state_prefetch_manager.h" +#endif // defined(OHOS_NO_STATE_PREFETCH) + namespace { // Timeout delay for new browser info responses. @@ -298,11 +304,61 @@ void CefBrowserInfoManager::WebContentsCreated( extra_info = pending_popup->extra_info; } +#if defined(OHOS_NO_STATE_PREFETCH) +bool CefBrowserInfoManager::IsPrerendering( + const content::GlobalRenderFrameHostId& global_id) { + std::vector browser_context_all = + CefBrowserContext::GetAll(); + if (browser_context_all.size() == 0) { + return false; + } + + auto* rfh = content::RenderFrameHost::FromID(global_id); + content::WebContents* web_contents = + content::WebContents::FromRenderFrameHost(rfh); + if (!web_contents) { + return false; + } + + for (auto& context: CefBrowserContext::GetAll()) { + prerender::NoStatePrefetchManager* no_state_prefetch_manager = + prerender::NoStatePrefetchManagerFactory::GetForBrowserContext( + context->AsBrowserContext()); + if (no_state_prefetch_manager) { + auto* no_state_prefetch_content = + no_state_prefetch_manager->GetNoStatePrefetchContents(web_contents); + if (no_state_prefetch_content) { + return true; + } + } + } + + return false; +} + +void CefBrowserInfoManager::CancelForPrerendering( + const content::GlobalRenderFrameHostId& global_id, + int timeout_id) { + CEF_REQUIRE_UIT(); + LOG(INFO) << "cancel for prerendering"; + if (!g_info_manager) { + return; + } + + if (!IsPrerendering(global_id)) { + return; + } + + TimeoutNewBrowserInfoResponse(global_id, timeout_id); +} +#endif + void CefBrowserInfoManager::OnGetNewBrowserInfo( const content::GlobalRenderFrameHostId& global_id, cef::mojom::BrowserManager::GetNewBrowserInfoCallback callback) { DCHECK(frame_util::IsValidGlobalId(global_id)); DCHECK(callback); + LOG(INFO) << "on get new browser info"; auto callback_runner = base::SequencedTaskRunnerHandle::Get(); @@ -335,6 +391,14 @@ void CefBrowserInfoManager::OnGetNewBrowserInfo( pending_new_browser_info_map_.insert( std::make_pair(global_id, std::move(pending))); + LOG(INFO) << "on get new browser info wait timeout"; +#if defined(OHOS_NO_STATE_PREFETCH) + CEF_POST_TASK( + CEF_UIT, + base::BindOnce(&CefBrowserInfoManager::CancelForPrerendering, + global_id, timeout_id)); +#endif + // Register a timeout for the pending response so that the renderer process // doesn't hang forever. if (!base::CommandLine::ForCurrentProcess()->HasSwitch( @@ -574,6 +638,7 @@ void CefBrowserInfoManager::TimeoutNewBrowserInfoResponse( const content::GlobalRenderFrameHostId& global_id, int timeout_id) { CEF_REQUIRE_UIT(); + LOG(INFO) << "on get new browser info timeout"; if (!g_info_manager) return; diff --git a/libcef/browser/browser_info_manager.h b/libcef/browser/browser_info_manager.h index 7d56b408fec254db6bb55f2744e26aba3d6b02da..fbc0a5ce6bdb7bc2e1f39a8fef3fca9fe6d9428e 100644 --- a/libcef/browser/browser_info_manager.h +++ b/libcef/browser/browser_info_manager.h @@ -223,6 +223,12 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver { const content::GlobalRenderFrameHostId& global_id, int timeout_id); +#if defined(OHOS_NO_STATE_PREFETCH) + static bool IsPrerendering(const content::GlobalRenderFrameHostId& global_id); + static void CancelForPrerendering( + const content::GlobalRenderFrameHostId& global_id, int timeout_id); +#endif + mutable base::Lock browser_info_lock_; // Access to the below members must be protected by |browser_info_lock_|.