blob: aadab8abb9481fd380a05f201d0f20b5d3443086 [file] [log] [blame]
// Copyright 2012 The Chromium Authors. All rights reserved.
// 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 <vector>
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "chrome/browser/search/instant_service_observer.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"
#include "ui/shell_dialogs/select_file_dialog.h"
#if defined(OS_ANDROID)
#error "Instant is only used on desktop";
#endif
namespace content {
class WebContents;
struct LoadCommittedDetails;
}
class GURL;
class InstantService;
class OmniboxView;
class Profile;
class SearchIPCRouterTest;
// 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 ui::SelectFileDialog::Listener {
public:
~SearchTabHelper() override;
// Invoked when the omnibox input state is changed in some way that might
// affect the search mode.
void OmniboxInputStateChanged();
// Called to indicate that the omnibox focus state changed with the given
// |reason|.
void OmniboxFocusChanged(OmniboxFocusState state,
OmniboxFocusChangeReason reason);
// 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;
FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, ChromeIdentityCheckMatch);
FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest,
ChromeIdentityCheckMatchSlightlyDifferentGmail);
FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest,
ChromeIdentityCheckMatchSlightlyDifferentGmail2);
FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, ChromeIdentityCheckMismatch);
FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest,
ChromeIdentityCheckSignedOutMismatch);
FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, HistorySyncCheckSyncing);
FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, HistorySyncCheckNotSyncing);
FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest,
FileSelectedUpdatesLastSelectedDirectory);
explicit SearchTabHelper(content::WebContents* web_contents);
// Overridden from contents::WebContentsObserver:
void DidStartNavigation(
content::NavigationHandle* navigation_handle) override;
void DidFinishNavigation(
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;
bool OnAddCustomLink(const GURL& url, const std::string& title) override;
bool OnUpdateCustomLink(const GURL& url,
const GURL& new_url,
const std::string& new_title) override;
bool OnDeleteCustomLink(const GURL& url) override;
void OnUndoCustomLinkAction() override;
void OnResetCustomLinks() override;
void OnDoesUrlResolve(
const GURL& url,
chrome::mojom::EmbeddedSearch::DoesUrlResolveCallback callback) override;
void OnLogEvent(NTPLoggingEventType event, base::TimeDelta time) override;
void OnLogMostVisitedImpression(
const ntp_tiles::NTPTileImpression& impression) override;
void OnLogMostVisitedNavigation(
const ntp_tiles::NTPTileImpression& impression) override;
void PasteIntoOmnibox(const base::string16& text) override;
bool ChromeIdentityCheck(const base::string16& identity) override;
bool HistorySyncCheck() override;
void OnSetCustomBackgroundURL(const GURL& url) override;
void OnSetCustomBackgroundURLWithAttributions(
const GURL& background_url,
const std::string& attribution_line_1,
const std::string& attribution_line_2,
const GURL& action_url) override;
void OnSelectLocalBackgroundImage() override;
// Overridden from InstantServiceObserver:
void ThemeInfoChanged(const ThemeBackgroundInfo& theme_info) override;
void MostVisitedItemsChanged(const std::vector<InstantMostVisitedItem>& items,
bool is_custom_links) override;
// Overridden from SelectFileDialog::Listener:
void FileSelected(const base::FilePath& path,
int index,
void* params) override;
void FileSelectionCanceled(void* params) override;
OmniboxView* GetOmniboxView();
const OmniboxView* GetOmniboxView() const;
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;
content::WebContents* web_contents_;
SearchIPCRouter ipc_router_;
InstantService* instant_service_;
bool is_setting_title_ = false;
scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
DISALLOW_COPY_AND_ASSIGN(SearchTabHelper);
};
#endif // CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_