// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/download/android/new_navigation_observer.h"
#include "content/public/browser/navigation_handle.h"
NewNavigationObserver* NewNavigationObserver::GetInstance() {
static base::NoDestructor<NewNavigationObserver> instance;
return instance.get();
}
NewNavigationObserver::NewNavigationObserver() = default;
NewNavigationObserver::~NewNavigationObserver() = default;
void NewNavigationObserver::StartObserving(content::WebContents* web_contents) {
if (web_contents) {
content::WebContents* main_web_contents =
web_contents->GetOutermostWebContents();
navigation_observers_[main_web_contents] =
std::make_unique<NewNavigationObserver::DownloadNavigationObserver>(
main_web_contents);
}
}
void NewNavigationObserver::StopObserving(content::WebContents* web_contents) {
if (web_contents) {
navigation_observers_.erase(web_contents->GetOutermostWebContents());
}
}
bool NewNavigationObserver::HasNewNavigation(
content::WebContents* web_contents) {
if (!web_contents) {
return false;
}
content::WebContents* main_web_contents =
web_contents->GetOutermostWebContents();
if (navigation_observers_.find(main_web_contents) !=
navigation_observers_.end()) {
return navigation_observers_[main_web_contents]->has_new_navigation();
}
return false;
}
NewNavigationObserver::DownloadNavigationObserver::DownloadNavigationObserver(
content::WebContents* web_contents)
: content::WebContentsObserver(web_contents) {}
NewNavigationObserver::DownloadNavigationObserver::
~DownloadNavigationObserver() = default;
void NewNavigationObserver::DownloadNavigationObserver::DidStartNavigation(
content::NavigationHandle* navigation_handle) {
if (navigation_handle->IsInPrimaryMainFrame()) {
has_new_navigation_ = true;
}
}
void NewNavigationObserver::DownloadNavigationObserver::WebContentsDestroyed() {
NewNavigationObserver::GetInstance()->StopObserving(web_contents());
}