blob: 35e846109f6a5617de2de0a6f4d6938fa90779b3 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_
#define CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_
#include <memory>
#include <string>
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "chrome/browser/search/instant_service_observer.h"
#include "chrome/browser/ui/omnibox/omnibox_tab_helper.h"
#include "chrome/browser/ui/search/search_ipc_router.h"
#include "chrome/common/search/instant_types.h"
#include "chrome/common/search/ntp_logging_events.h"
#include "components/ntp_tiles/ntp_tile_impression.h"
#include "components/omnibox/common/omnibox_focus_state.h"
#include "content/public/browser/reload_type.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
#if BUILDFLAG(IS_ANDROID)
#error "Instant is only used on desktop";
#endif
namespace content {
class WebContents;
struct LoadCommittedDetails;
} // namespace content
namespace gfx {
class Image;
}
class GURL;
class InstantService;
class Profile;
class SearchIPCRouterTest;
class SkBitmap;
// This is the browser-side, per-tab implementation of the embeddedSearch API
// (see https://www.chromium.org/embeddedsearch).
class SearchTabHelper : public content::WebContentsObserver,
public content::WebContentsUserData<SearchTabHelper>,
public InstantServiceObserver,
public SearchIPCRouter::Delegate,
public OmniboxTabHelper::Observer {
public:
SearchTabHelper(const SearchTabHelper&) = delete;
SearchTabHelper& operator=(const SearchTabHelper&) = delete;
~SearchTabHelper() override;
static void BindEmbeddedSearchConnecter(
mojo::PendingAssociatedReceiver<search::mojom::EmbeddedSearchConnector>
receiver,
content::RenderFrameHost* rfh);
// Called when the tab corresponding to |this| instance is activated.
void OnTabActivated();
// Called when the tab corresponding to |this| instance is deactivated.
void OnTabDeactivated();
SearchIPCRouter& ipc_router_for_testing() { return ipc_router_; }
private:
friend class content::WebContentsUserData<SearchTabHelper>;
friend class SearchIPCRouterTest;
explicit SearchTabHelper(content::WebContents* web_contents);
// Overridden from contents::WebContentsObserver:
void DidStartNavigation(
content::NavigationHandle* navigation_handle) override;
void TitleWasSet(content::NavigationEntry* entry) override;
void DidFinishLoad(content::RenderFrameHost* render_frame_host,
const GURL& validated_url) override;
void NavigationEntryCommitted(
const content::LoadCommittedDetails& load_details) override;
// Overridden from SearchIPCRouter::Delegate:
void FocusOmnibox(bool focus) override;
void OnDeleteMostVisitedItem(const GURL& url) override;
void OnUndoMostVisitedDeletion(const GURL& url) override;
void OnUndoAllMostVisitedDeletions() override;
// Overridden from InstantServiceObserver:
void NtpThemeChanged(NtpTheme theme) override;
void MostVisitedInfoChanged(
const InstantMostVisitedInfo& most_visited_info) override;
// Overridden from OmniboxTabHelper::Observer:
void OnOmniboxInputStateChanged() override;
void OnOmniboxInputInProgress(bool in_progress) override {}
void OnOmniboxFocusChanged(OmniboxFocusState state,
OmniboxFocusChangeReason reason) override;
void OnOmniboxPopupVisibilityChanged(bool popup_is_open) override {}
void OnBitmapFetched(int match_index,
const std::string& image_url,
const SkBitmap& bitmap);
void OnFaviconFetched(int match_index,
const std::string& page_url,
const gfx::Image& favicon);
Profile* profile() const;
// Returns whether input is in progress, i.e. if the omnibox has focus and the
// active tab is in mode SEARCH_SUGGESTIONS.
bool IsInputInProgress() const;
// Called when a user confirms deleting an autocomplete match. Note: might be
// called synchronously with accepted = true if this feature is disabled
// (which defaults the behavior to silent deletions).
void OnDeleteAutocompleteMatchConfirm(uint8_t line, bool accepted);
void CloseNTPCustomizeChromeFeaturePromo();
SearchIPCRouter ipc_router_;
raw_ptr<InstantService> instant_service_;
bool is_setting_title_ = false;
WEB_CONTENTS_USER_DATA_KEY_DECL();
base::WeakPtrFactory<SearchTabHelper> weak_factory_{this};
};
#endif // CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_