#ifndef CHROME_BROWSER_UI_OMNIBOX_CHROME_OMNIBOX_NAVIGATION_OBSERVER_H_
#define CHROME_BROWSER_UI_OMNIBOX_CHROME_OMNIBOX_NAVIGATION_OBSERVER_H_
#include <memory>
#include <string>
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "components/omnibox/browser/autocomplete_match.h"
#include "components/omnibox/browser/omnibox_navigation_observer.h"
#include "content/public/browser/reload_type.h"
#include "content/public/browser/web_contents_observer.h"
#include "services/network/public/mojom/url_response_head.mojom-forward.h"
class Profile;
class ChromeOmniboxNavigationObserver
: public base::RefCounted<ChromeOmniboxNavigationObserver>,
public content::WebContentsObserver {
public:
enum class AlternativeFetchState {
kFetchNotComplete,
kFetchSucceeded,
kFetchFailed,
};
using ShowInfobarCallback =
base::OnceCallback<void(ChromeOmniboxNavigationObserver*)>;
static void Create(content::NavigationHandle* navigation,
Profile* profile,
const std::u16string& text,
const AutocompleteMatch& match,
const AutocompleteMatch& alternative_nav_match);
static void CreateForTesting(content::NavigationHandle* navigation,
Profile* profile,
const std::u16string& text,
const AutocompleteMatch& match,
const AutocompleteMatch& alternative_nav_match,
network::mojom::URLLoaderFactory* loader_factory,
ShowInfobarCallback show_infobar);
void DidFinishNavigation(
content::NavigationHandle* navigation_handle) override;
void On404();
void OnAlternativeLoaderDone(bool success);
void CreateAlternativeNavInfoBar();
private:
ChromeOmniboxNavigationObserver(
content::NavigationHandle& navigation,
Profile* profile,
const std::u16string& text,
const AutocompleteMatch& match,
const AutocompleteMatch& alternative_nav_match,
network::mojom::URLLoaderFactory* loader_factory,
ShowInfobarCallback show_infobar);
~ChromeOmniboxNavigationObserver() override;
friend class base::RefCounted<ChromeOmniboxNavigationObserver>;
class AlternativeNavigationURLLoader;
void ShowAlternativeNavInfoBar();
const std::u16string text_;
const AutocompleteMatch match_;
const AutocompleteMatch alternative_nav_match_;
const int64_t navigation_id_;
const raw_ptr<Profile> profile_;
ShowInfobarCallback show_infobar_;
std::unique_ptr<AlternativeNavigationURLLoader> loader_;
AlternativeFetchState fetch_state_ = AlternativeFetchState::kFetchNotComplete;
};
#endif