|  | // Copyright 2013 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. | 
|  |  | 
|  | #include "chrome/browser/ui/search/search_ipc_router.h" | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/command_line.h" | 
|  | #include "base/memory/scoped_ptr.h" | 
|  | #include "base/metrics/field_trial.h" | 
|  | #include "base/strings/string16.h" | 
|  | #include "base/strings/utf_string_conversions.h" | 
|  | #include "base/tuple.h" | 
|  | #include "chrome/browser/profiles/profile.h" | 
|  | #include "chrome/browser/search/search.h" | 
|  | #include "chrome/browser/search_engines/template_url_service_factory.h" | 
|  | #include "chrome/browser/ui/search/search_ipc_router_policy_impl.h" | 
|  | #include "chrome/browser/ui/search/search_tab_helper.h" | 
|  | #include "chrome/browser/ui/tabs/tab_strip_model.h" | 
|  | #include "chrome/common/chrome_switches.h" | 
|  | #include "chrome/common/instant_types.h" | 
|  | #include "chrome/common/ntp_logging_events.h" | 
|  | #include "chrome/common/render_messages.h" | 
|  | #include "chrome/common/url_constants.h" | 
|  | #include "chrome/test/base/browser_with_test_window_test.h" | 
|  | #include "chrome/test/base/search_test_utils.h" | 
|  | #include "components/omnibox/common/omnibox_focus_state.h" | 
|  | #include "components/search_engines/template_url_service.h" | 
|  | #include "content/public/browser/navigation_controller.h" | 
|  | #include "content/public/browser/navigation_entry.h" | 
|  | #include "content/public/browser/web_contents.h" | 
|  | #include "content/public/test/mock_render_process_host.h" | 
|  | #include "ipc/ipc_message.h" | 
|  | #include "ipc/ipc_message_start.h" | 
|  | #include "ipc/ipc_test_sink.h" | 
|  | #include "testing/gmock/include/gmock/gmock.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  | #include "ui/base/window_open_disposition.h" | 
|  | #include "url/gurl.h" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | class MockSearchIPCRouterDelegate : public SearchIPCRouter::Delegate { | 
|  | public: | 
|  | virtual ~MockSearchIPCRouterDelegate() {} | 
|  |  | 
|  | MOCK_METHOD1(OnInstantSupportDetermined, void(bool supports_instant)); | 
|  | MOCK_METHOD1(FocusOmnibox, void(OmniboxFocusState state)); | 
|  | MOCK_METHOD3(NavigateToURL, void(const GURL&, WindowOpenDisposition, bool)); | 
|  | MOCK_METHOD1(OnDeleteMostVisitedItem, void(const GURL& url)); | 
|  | MOCK_METHOD1(OnUndoMostVisitedDeletion, void(const GURL& url)); | 
|  | MOCK_METHOD0(OnUndoAllMostVisitedDeletions, void()); | 
|  | MOCK_METHOD2(OnLogEvent, void(NTPLoggingEventType event, | 
|  | base::TimeDelta time)); | 
|  | MOCK_METHOD2(OnLogMostVisitedImpression, | 
|  | void(int position, const base::string16& provider)); | 
|  | MOCK_METHOD2(OnLogMostVisitedNavigation, | 
|  | void(int position, const base::string16& provider)); | 
|  | MOCK_METHOD1(PasteIntoOmnibox, void(const base::string16&)); | 
|  | MOCK_METHOD1(OnChromeIdentityCheck, void(const base::string16& identity)); | 
|  | MOCK_METHOD0(OnHistorySyncCheck, void()); | 
|  | }; | 
|  |  | 
|  | class MockSearchIPCRouterPolicy : public SearchIPCRouter::Policy { | 
|  | public: | 
|  | virtual ~MockSearchIPCRouterPolicy() {} | 
|  |  | 
|  | MOCK_METHOD1(ShouldProcessFocusOmnibox, bool(bool)); | 
|  | MOCK_METHOD1(ShouldProcessNavigateToURL, bool(bool)); | 
|  | MOCK_METHOD0(ShouldProcessDeleteMostVisitedItem, bool()); | 
|  | MOCK_METHOD0(ShouldProcessUndoMostVisitedDeletion, bool()); | 
|  | MOCK_METHOD0(ShouldProcessUndoAllMostVisitedDeletions, bool()); | 
|  | MOCK_METHOD0(ShouldProcessLogEvent, bool()); | 
|  | MOCK_METHOD1(ShouldProcessPasteIntoOmnibox, bool(bool)); | 
|  | MOCK_METHOD0(ShouldProcessChromeIdentityCheck, bool()); | 
|  | MOCK_METHOD0(ShouldProcessHistorySyncCheck, bool()); | 
|  | MOCK_METHOD0(ShouldSendSetPromoInformation, bool()); | 
|  | MOCK_METHOD0(ShouldSendSetDisplayInstantResults, bool()); | 
|  | MOCK_METHOD0(ShouldSendSetSuggestionToPrefetch, bool()); | 
|  | MOCK_METHOD1(ShouldSendSetInputInProgress, bool(bool)); | 
|  | MOCK_METHOD0(ShouldSendOmniboxFocusChanged, bool()); | 
|  | MOCK_METHOD0(ShouldSendMostVisitedItems, bool()); | 
|  | MOCK_METHOD0(ShouldSendThemeBackgroundInfo, bool()); | 
|  | MOCK_METHOD0(ShouldSubmitQuery, bool()); | 
|  | }; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | class SearchIPCRouterTest : public BrowserWithTestWindowTest { | 
|  | public: | 
|  | SearchIPCRouterTest() : field_trial_list_(NULL) {} | 
|  |  | 
|  | void SetUp() override { | 
|  | BrowserWithTestWindowTest::SetUp(); | 
|  | AddTab(browser(), GURL("chrome://blank")); | 
|  | SearchTabHelper::CreateForWebContents(web_contents()); | 
|  |  | 
|  | TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( | 
|  | profile(), | 
|  | &TemplateURLServiceFactory::BuildInstanceFor); | 
|  | TemplateURLService* template_url_service = | 
|  | TemplateURLServiceFactory::GetForProfile(profile()); | 
|  | search_test_utils::WaitForTemplateURLServiceToLoad(template_url_service); | 
|  |  | 
|  | TemplateURLData data; | 
|  | data.SetShortName(base::ASCIIToUTF16("foo.com")); | 
|  | data.SetURL("http://foo.com/url?bar={searchTerms}"); | 
|  | data.instant_url = "http://foo.com/instant?foo=foo#foo=foo&espv"; | 
|  | data.new_tab_url = "https://foo.com/newtab?espv"; | 
|  | data.alternate_urls.push_back("http://foo.com/alt#quux={searchTerms}"); | 
|  | data.search_terms_replacement_key = "espv"; | 
|  |  | 
|  | TemplateURL* template_url = new TemplateURL(data); | 
|  | // Takes ownership of |template_url|. | 
|  | template_url_service->Add(template_url); | 
|  | template_url_service->SetUserSelectedDefaultSearchProvider(template_url); | 
|  | process()->sink().ClearMessages(); | 
|  | } | 
|  |  | 
|  | content::WebContents* web_contents() { | 
|  | return browser()->tab_strip_model()->GetActiveWebContents(); | 
|  | } | 
|  |  | 
|  | content::MockRenderProcessHost* process() { | 
|  | return static_cast<content::MockRenderProcessHost*>( | 
|  | web_contents()->GetRenderViewHost()->GetProcess()); | 
|  | } | 
|  |  | 
|  | SearchTabHelper* GetSearchTabHelper( | 
|  | content::WebContents* web_contents) { | 
|  | EXPECT_NE(static_cast<content::WebContents*>(NULL), web_contents); | 
|  | return SearchTabHelper::FromWebContents(web_contents); | 
|  | } | 
|  |  | 
|  | void SetupMockDelegateAndPolicy() { | 
|  | content::WebContents* contents = web_contents(); | 
|  | ASSERT_NE(static_cast<content::WebContents*>(NULL), contents); | 
|  | SearchTabHelper* search_tab_helper = GetSearchTabHelper(contents); | 
|  | ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); | 
|  | search_tab_helper->ipc_router().set_delegate_for_testing(mock_delegate()); | 
|  | search_tab_helper->ipc_router().set_policy_for_testing( | 
|  | make_scoped_ptr(new MockSearchIPCRouterPolicy)); | 
|  | } | 
|  |  | 
|  | bool MessageWasSent(uint32_t id) { | 
|  | return process()->sink().GetFirstMessageMatching(id) != NULL; | 
|  | } | 
|  |  | 
|  | void VerifyDisplayInstantResultsMsg(bool expected_param_value) { | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendSetDisplayInstantResults()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | GetSearchIPCRouter().SetDisplayInstantResults(); | 
|  | const IPC::Message* message = process()->sink().GetFirstMessageMatching( | 
|  | ChromeViewMsg_SearchBoxSetDisplayInstantResults::ID); | 
|  | EXPECT_NE(static_cast<const IPC::Message*>(NULL), message); | 
|  | base::Tuple<bool> display_instant_results_param; | 
|  | ChromeViewMsg_SearchBoxSetDisplayInstantResults::Read( | 
|  | message, &display_instant_results_param); | 
|  | EXPECT_EQ(expected_param_value, | 
|  | base::get<0>(display_instant_results_param)); | 
|  | } | 
|  |  | 
|  | MockSearchIPCRouterDelegate* mock_delegate() { return &delegate_; } | 
|  |  | 
|  | MockSearchIPCRouterPolicy* GetSearchIPCRouterPolicy() { | 
|  | content::WebContents* contents = web_contents(); | 
|  | EXPECT_NE(static_cast<content::WebContents*>(NULL), contents); | 
|  | SearchTabHelper* search_tab_helper = GetSearchTabHelper(contents); | 
|  | EXPECT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); | 
|  | return static_cast<MockSearchIPCRouterPolicy*>( | 
|  | search_tab_helper->ipc_router().policy_for_testing()); | 
|  | } | 
|  |  | 
|  | SearchIPCRouter& GetSearchIPCRouter() { | 
|  | return GetSearchTabHelper(web_contents())->ipc_router(); | 
|  | } | 
|  |  | 
|  | int GetSearchIPCRouterSeqNo() { | 
|  | return GetSearchIPCRouter().page_seq_no_for_testing(); | 
|  | } | 
|  |  | 
|  | void OnMessageReceived(const IPC::Message& message) { | 
|  | bool should_handle_message = | 
|  | search::IsRenderedInInstantProcess(web_contents(), profile()); | 
|  | bool handled = GetSearchIPCRouter().OnMessageReceived(message); | 
|  | ASSERT_EQ(should_handle_message, handled); | 
|  | } | 
|  |  | 
|  | bool OnSpuriousMessageReceived(const IPC::Message& message) { | 
|  | return GetSearchIPCRouter().OnMessageReceived(message); | 
|  | } | 
|  |  | 
|  | bool IsActiveTab(content::WebContents* contents) { | 
|  | return GetSearchTabHelper(contents)->ipc_router().is_active_tab_; | 
|  | } | 
|  |  | 
|  | private: | 
|  | MockSearchIPCRouterDelegate delegate_; | 
|  | base::FieldTrialList field_trial_list_; | 
|  | }; | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, IgnoreMessagesFromNonInstantRenderers) { | 
|  | NavigateAndCommitActiveTab(GURL("file://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | GURL destination_url("www.foo.com"); | 
|  | EXPECT_CALL(*mock_delegate(), NavigateToURL(destination_url, CURRENT_TAB, | 
|  | true)).Times(0); | 
|  | content::WebContents* contents = web_contents(); | 
|  | bool is_active_tab = IsActiveTab(contents); | 
|  | EXPECT_TRUE(is_active_tab); | 
|  |  | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldProcessNavigateToURL(is_active_tab)).Times(0); | 
|  |  | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxNavigate( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), destination_url, | 
|  | CURRENT_TAB, true)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, ProcessFocusOmniboxMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*mock_delegate(), FocusOmnibox(OMNIBOX_FOCUS_VISIBLE)).Times(1); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | bool is_active_tab = IsActiveTab(contents); | 
|  | EXPECT_TRUE(is_active_tab); | 
|  | EXPECT_CALL(*policy, ShouldProcessFocusOmnibox(is_active_tab)).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | OnMessageReceived(ChromeViewHostMsg_FocusOmnibox( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), | 
|  | OMNIBOX_FOCUS_VISIBLE)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, IgnoreFocusOmniboxMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*mock_delegate(), FocusOmnibox(OMNIBOX_FOCUS_VISIBLE)).Times(0); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | bool is_active_tab = IsActiveTab(contents); | 
|  | EXPECT_TRUE(is_active_tab); | 
|  | EXPECT_CALL(*policy, ShouldProcessFocusOmnibox(is_active_tab)).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | OnMessageReceived(ChromeViewHostMsg_FocusOmnibox( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), | 
|  | OMNIBOX_FOCUS_VISIBLE)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, HandleTabChangedEvents) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | content::WebContents* contents = web_contents(); | 
|  | EXPECT_EQ(0, browser()->tab_strip_model()->GetIndexOfWebContents(contents)); | 
|  | EXPECT_TRUE(IsActiveTab(contents)); | 
|  |  | 
|  | // Add a new tab to deactivate the current tab. | 
|  | AddTab(browser(), GURL(url::kAboutBlankURL)); | 
|  | EXPECT_EQ(2, browser()->tab_strip_model()->count()); | 
|  | EXPECT_EQ(1, browser()->tab_strip_model()->GetIndexOfWebContents(contents)); | 
|  | EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); | 
|  | EXPECT_FALSE(IsActiveTab(contents)); | 
|  |  | 
|  | // Activate the first tab. | 
|  | browser()->tab_strip_model()->ActivateTabAt(1, false); | 
|  | EXPECT_EQ(browser()->tab_strip_model()->active_index(), | 
|  | browser()->tab_strip_model()->GetIndexOfWebContents(contents)); | 
|  | EXPECT_TRUE(IsActiveTab(contents)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, ProcessNavigateToURLMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | GURL destination_url("www.foo.com"); | 
|  | EXPECT_CALL(*mock_delegate(), NavigateToURL(destination_url, CURRENT_TAB, | 
|  | true)).Times(1); | 
|  | content::WebContents* contents = web_contents(); | 
|  | bool is_active_tab = IsActiveTab(contents); | 
|  | EXPECT_TRUE(is_active_tab); | 
|  |  | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldProcessNavigateToURL(is_active_tab)).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxNavigate( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), destination_url, | 
|  | CURRENT_TAB, true)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, IgnoreNavigateToURLMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | GURL destination_url("www.foo.com"); | 
|  | EXPECT_CALL(*mock_delegate(), NavigateToURL(destination_url, CURRENT_TAB, | 
|  | true)).Times(0); | 
|  | content::WebContents* contents = web_contents(); | 
|  | bool is_active_tab = IsActiveTab(contents); | 
|  | EXPECT_TRUE(is_active_tab); | 
|  |  | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldProcessNavigateToURL(is_active_tab)).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxNavigate( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), destination_url, | 
|  | CURRENT_TAB, true)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, ProcessLogEventMsg) { | 
|  | base::TimeDelta delta = base::TimeDelta::FromMilliseconds(123); | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*mock_delegate(), OnLogEvent(NTP_MOUSEOVER, delta)).Times(1); | 
|  | EXPECT_CALL(*policy, ShouldProcessLogEvent()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_LogEvent( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), | 
|  | NTP_MOUSEOVER, delta)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, IgnoreLogEventMsg) { | 
|  | base::TimeDelta delta = base::TimeDelta::FromMilliseconds(123); | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*mock_delegate(), OnLogEvent(NTP_MOUSEOVER, delta)).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessLogEvent()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_LogEvent( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), | 
|  | NTP_MOUSEOVER, delta)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, ProcessLogMostVisitedImpressionMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*mock_delegate(), | 
|  | OnLogMostVisitedImpression(3, base::ASCIIToUTF16("Server"))).Times(1); | 
|  | EXPECT_CALL(*policy, ShouldProcessLogEvent()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_LogMostVisitedImpression( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), 3, | 
|  | base::ASCIIToUTF16("Server"))); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, ProcessLogMostVisitedNavigationMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*mock_delegate(), | 
|  | OnLogMostVisitedNavigation(3, base::ASCIIToUTF16("Server"))).Times(1); | 
|  | EXPECT_CALL(*policy, ShouldProcessLogEvent()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_LogMostVisitedNavigation( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), 3, | 
|  | base::ASCIIToUTF16("Server"))); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, ProcessChromeIdentityCheckMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | const base::string16 test_identity = base::ASCIIToUTF16("foo@bar.com"); | 
|  | EXPECT_CALL(*mock_delegate(), OnChromeIdentityCheck(test_identity)).Times(1); | 
|  | EXPECT_CALL(*policy, ShouldProcessChromeIdentityCheck()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_ChromeIdentityCheck( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), test_identity)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, IgnoreChromeIdentityCheckMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  |  | 
|  | const base::string16 test_identity = base::ASCIIToUTF16("foo@bar.com"); | 
|  | EXPECT_CALL(*mock_delegate(), OnChromeIdentityCheck(test_identity)).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessChromeIdentityCheck()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_ChromeIdentityCheck( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), test_identity)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, ProcessHistorySyncCheckMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*mock_delegate(), OnHistorySyncCheck()).Times(1); | 
|  | EXPECT_CALL(*policy, ShouldProcessHistorySyncCheck()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_HistorySyncCheck( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo())); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, IgnoreHistorySyncCheckMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  |  | 
|  | EXPECT_CALL(*mock_delegate(), OnHistorySyncCheck()).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessHistorySyncCheck()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_HistorySyncCheck( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo())); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, ProcessDeleteMostVisitedItemMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | GURL item_url("www.foo.com"); | 
|  | EXPECT_CALL(*mock_delegate(), OnDeleteMostVisitedItem(item_url)).Times(1); | 
|  | EXPECT_CALL(*policy, ShouldProcessDeleteMostVisitedItem()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxDeleteMostVisitedItem( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), item_url)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, IgnoreDeleteMostVisitedItemMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | GURL item_url("www.foo.com"); | 
|  | EXPECT_CALL(*mock_delegate(), OnDeleteMostVisitedItem(item_url)).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessDeleteMostVisitedItem()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxDeleteMostVisitedItem( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), item_url)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, ProcessUndoMostVisitedDeletionMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | GURL item_url("www.foo.com"); | 
|  | EXPECT_CALL(*mock_delegate(), OnUndoMostVisitedDeletion(item_url)).Times(1); | 
|  | EXPECT_CALL(*policy, ShouldProcessUndoMostVisitedDeletion()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxUndoMostVisitedDeletion( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), item_url)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, IgnoreUndoMostVisitedDeletionMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | GURL item_url("www.foo.com"); | 
|  | EXPECT_CALL(*mock_delegate(), OnUndoMostVisitedDeletion(item_url)).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessUndoMostVisitedDeletion()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxUndoMostVisitedDeletion( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), item_url)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, ProcessUndoAllMostVisitedDeletionsMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*mock_delegate(), OnUndoAllMostVisitedDeletions()).Times(1); | 
|  | EXPECT_CALL(*policy, ShouldProcessUndoAllMostVisitedDeletions()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxUndoAllMostVisitedDeletions( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo())); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, IgnoreUndoAllMostVisitedDeletionsMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*mock_delegate(), OnUndoAllMostVisitedDeletions()).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessUndoAllMostVisitedDeletions()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxUndoAllMostVisitedDeletions( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo())); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, IgnoreMessageIfThePageIsNotActive) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | int page_seq_no = GetSearchIPCRouterSeqNo(); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | bool is_active_tab = IsActiveTab(contents); | 
|  | GURL item_url("www.foo.com"); | 
|  | EXPECT_CALL(*mock_delegate(), NavigateToURL(item_url, CURRENT_TAB, | 
|  | true)).Times(0); | 
|  | // At this point, in a real test, the navigation would cause the | 
|  | // SearchIPCRouter's page sequence to advance. In this test it doesn't, so | 
|  | // we'll decrement the sequence number on this side to simulate it. | 
|  | --page_seq_no; | 
|  | EXPECT_CALL(*policy, ShouldProcessNavigateToURL(is_active_tab)).Times(0); | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxNavigate( | 
|  | contents->GetRoutingID(), page_seq_no, item_url, CURRENT_TAB, true)); | 
|  |  | 
|  | EXPECT_CALL(*mock_delegate(), OnDeleteMostVisitedItem(item_url)).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessDeleteMostVisitedItem()).Times(0); | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxDeleteMostVisitedItem( | 
|  | contents->GetRoutingID(), page_seq_no, item_url)); | 
|  |  | 
|  | EXPECT_CALL(*mock_delegate(), OnUndoMostVisitedDeletion(item_url)).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessUndoMostVisitedDeletion()).Times(0); | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxUndoMostVisitedDeletion( | 
|  | contents->GetRoutingID(), page_seq_no, item_url)); | 
|  |  | 
|  | EXPECT_CALL(*mock_delegate(), OnUndoAllMostVisitedDeletions()).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessUndoAllMostVisitedDeletions()).Times(0); | 
|  | OnMessageReceived(ChromeViewHostMsg_SearchBoxUndoAllMostVisitedDeletions( | 
|  | contents->GetRoutingID(), page_seq_no)); | 
|  |  | 
|  | EXPECT_CALL(*mock_delegate(), FocusOmnibox(OMNIBOX_FOCUS_VISIBLE)).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessFocusOmnibox(is_active_tab)).Times(0); | 
|  | OnMessageReceived(ChromeViewHostMsg_FocusOmnibox( | 
|  | contents->GetRoutingID(), page_seq_no, OMNIBOX_FOCUS_VISIBLE)); | 
|  |  | 
|  | base::TimeDelta delta = base::TimeDelta::FromMilliseconds(123); | 
|  | EXPECT_CALL(*mock_delegate(), OnLogEvent(NTP_MOUSEOVER, delta)).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessLogEvent()).Times(0); | 
|  | OnMessageReceived(ChromeViewHostMsg_LogEvent(contents->GetRoutingID(), | 
|  | page_seq_no, | 
|  | NTP_MOUSEOVER, delta)); | 
|  |  | 
|  | base::string16 text; | 
|  | EXPECT_CALL(*mock_delegate(), PasteIntoOmnibox(text)).Times(0); | 
|  | EXPECT_CALL(*policy, ShouldProcessPasteIntoOmnibox(is_active_tab)).Times(0); | 
|  | OnMessageReceived(ChromeViewHostMsg_PasteAndOpenDropdown( | 
|  | contents->GetRoutingID(), page_seq_no, text)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, ProcessPasteAndOpenDropdownMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | bool is_active_tab = IsActiveTab(contents); | 
|  | EXPECT_TRUE(is_active_tab); | 
|  |  | 
|  | base::string16 text; | 
|  | EXPECT_CALL(*mock_delegate(), PasteIntoOmnibox(text)).Times(1); | 
|  | EXPECT_CALL(*policy, ShouldProcessPasteIntoOmnibox(is_active_tab)).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  | OnMessageReceived(ChromeViewHostMsg_PasteAndOpenDropdown( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), text)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, IgnorePasteAndOpenDropdownMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | base::string16 text; | 
|  | EXPECT_CALL(*mock_delegate(), PasteIntoOmnibox(text)).Times(0); | 
|  |  | 
|  | content::WebContents* contents = web_contents(); | 
|  | bool is_active_tab = IsActiveTab(contents); | 
|  | EXPECT_TRUE(is_active_tab); | 
|  |  | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldProcessPasteIntoOmnibox(is_active_tab)).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | OnMessageReceived(ChromeViewHostMsg_PasteAndOpenDropdown( | 
|  | contents->GetRoutingID(), GetSearchIPCRouterSeqNo(), text)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, SendSetPromoInformationMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendSetPromoInformation()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | GetSearchIPCRouter().SetPromoInformation(true); | 
|  | EXPECT_TRUE(MessageWasSent(ChromeViewMsg_SearchBoxPromoInformation::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, DoNotSendSetPromoInformationMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendSetPromoInformation()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | GetSearchIPCRouter().SetPromoInformation(false); | 
|  | EXPECT_FALSE(MessageWasSent(ChromeViewMsg_SearchBoxPromoInformation::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, | 
|  | SendSetDisplayInstantResultsMsg_EnableInstantOnResultsPage) { | 
|  | ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( | 
|  | "EmbeddedSearch", | 
|  | "Group1 espv:42 query_extraction:1 prefetch_results_srp:1")); | 
|  | NavigateAndCommitActiveTab(GURL("https://foo.com/url?espv&bar=abc")); | 
|  |  | 
|  | // Make sure ChromeViewMsg_SearchBoxSetDisplayInstantResults message param is | 
|  | // set to true if the underlying page is a results page and | 
|  | // "prefetch_results_srp" flag is enabled via field trials. | 
|  | VerifyDisplayInstantResultsMsg(true); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, | 
|  | SendSetDisplayInstantResultsMsg_DisableInstantOnResultsPage) { | 
|  | // |prefetch_results_srp" flag is disabled via field trials. | 
|  | ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( | 
|  | "EmbeddedSearch", | 
|  | "Group1 espv:42 query_extraction:1 prefetch_results_srp:0")); | 
|  | NavigateAndCommitActiveTab(GURL("https://foo.com/url?espv&bar=abc")); | 
|  |  | 
|  | // Make sure ChromeViewMsg_SearchBoxSetDisplayInstantResults message param is | 
|  | // set to false. | 
|  | VerifyDisplayInstantResultsMsg(false); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, | 
|  | SendSetDisplayInstantResultsMsg_EnableInstantOutsideSearchResultsPage) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | // Make sure ChromeViewMsg_SearchBoxSetDisplayInstantResults param is set to | 
|  | // true if the underlying page is not a search results page. | 
|  | VerifyDisplayInstantResultsMsg(true); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, DoNotSendSetDisplayInstantResultsMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendSetDisplayInstantResults()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | GetSearchIPCRouter().SetDisplayInstantResults(); | 
|  | EXPECT_FALSE(MessageWasSent( | 
|  | ChromeViewMsg_SearchBoxSetDisplayInstantResults::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, SendSetSuggestionToPrefetch) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendSetSuggestionToPrefetch()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | content::WebContents* contents = web_contents(); | 
|  | GetSearchTabHelper(contents)->SetSuggestionToPrefetch(InstantSuggestion()); | 
|  | EXPECT_TRUE(MessageWasSent( | 
|  | ChromeViewMsg_SearchBoxSetSuggestionToPrefetch::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, DoNotSendSetSuggestionToPrefetch) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendSetSuggestionToPrefetch()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | content::WebContents* contents = web_contents(); | 
|  | GetSearchTabHelper(contents)->SetSuggestionToPrefetch(InstantSuggestion()); | 
|  | EXPECT_FALSE(MessageWasSent( | 
|  | ChromeViewMsg_SearchBoxSetSuggestionToPrefetch::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, SendOmniboxFocusChange) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendOmniboxFocusChanged()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | GetSearchIPCRouter().OmniboxFocusChanged(OMNIBOX_FOCUS_NONE, | 
|  | OMNIBOX_FOCUS_CHANGE_EXPLICIT); | 
|  | EXPECT_TRUE(MessageWasSent(ChromeViewMsg_SearchBoxFocusChanged::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, DoNotSendOmniboxFocusChange) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendOmniboxFocusChanged()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | GetSearchIPCRouter().OmniboxFocusChanged(OMNIBOX_FOCUS_NONE, | 
|  | OMNIBOX_FOCUS_CHANGE_EXPLICIT); | 
|  | EXPECT_FALSE(MessageWasSent(ChromeViewMsg_SearchBoxFocusChanged::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, SendSetInputInProgress) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendSetInputInProgress(true)).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | GetSearchIPCRouter().SetInputInProgress(true); | 
|  | EXPECT_TRUE(MessageWasSent(ChromeViewMsg_SearchBoxSetInputInProgress::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, DoNotSendSetInputInProgress) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendSetInputInProgress(true)).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | GetSearchIPCRouter().SetInputInProgress(true); | 
|  | EXPECT_FALSE(MessageWasSent(ChromeViewMsg_SearchBoxSetInputInProgress::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, SendMostVisitedItemsMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendMostVisitedItems()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | GetSearchIPCRouter().SendMostVisitedItems( | 
|  | std::vector<InstantMostVisitedItem>()); | 
|  | EXPECT_TRUE(MessageWasSent( | 
|  | ChromeViewMsg_SearchBoxMostVisitedItemsChanged::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, DoNotSendMostVisitedItemsMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendMostVisitedItems()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | GetSearchIPCRouter().SendMostVisitedItems( | 
|  | std::vector<InstantMostVisitedItem>()); | 
|  | EXPECT_FALSE(MessageWasSent( | 
|  | ChromeViewMsg_SearchBoxMostVisitedItemsChanged::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, SendThemeBackgroundInfoMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendThemeBackgroundInfo()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | GetSearchIPCRouter().SendThemeBackgroundInfo(ThemeBackgroundInfo()); | 
|  | EXPECT_TRUE(MessageWasSent(ChromeViewMsg_SearchBoxThemeChanged::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, DoNotSendThemeBackgroundInfoMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSendThemeBackgroundInfo()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | GetSearchIPCRouter().SendThemeBackgroundInfo(ThemeBackgroundInfo()); | 
|  | EXPECT_FALSE(MessageWasSent(ChromeViewMsg_SearchBoxThemeChanged::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, SendSubmitMsg) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSubmitQuery()).Times(1) | 
|  | .WillOnce(testing::Return(true)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | GetSearchIPCRouter().Submit(base::string16(), EmbeddedSearchRequestParams()); | 
|  | EXPECT_TRUE(MessageWasSent(ChromeViewMsg_SearchBoxSubmit::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, DoNotSendSubmitMsg) { | 
|  | NavigateAndCommitActiveTab(GURL(chrome::kChromeSearchLocalNtpUrl)); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); | 
|  | EXPECT_CALL(*policy, ShouldSubmitQuery()).Times(1) | 
|  | .WillOnce(testing::Return(false)); | 
|  |  | 
|  | process()->sink().ClearMessages(); | 
|  | GetSearchIPCRouter().Submit(base::string16(), EmbeddedSearchRequestParams()); | 
|  | EXPECT_FALSE(MessageWasSent(ChromeViewMsg_SearchBoxSubmit::ID)); | 
|  | } | 
|  |  | 
|  | TEST_F(SearchIPCRouterTest, SpuriousMessageTypesIgnored) { | 
|  | NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); | 
|  | SetupMockDelegateAndPolicy(); | 
|  | const int routing_id = web_contents()->GetRoutingID(); | 
|  |  | 
|  | // Construct a series of synthetic messages for each valid IPC message type, | 
|  | // ensuring the router ignores them all. | 
|  | for (int i = 0; i < LastIPCMsgStart; ++i) { | 
|  | const int message_id = i << 16; | 
|  | ASSERT_EQ(IPC_MESSAGE_ID_CLASS(message_id), i); | 
|  | IPC::Message msg(routing_id, message_id, IPC::Message::PRIORITY_LOW); | 
|  | EXPECT_FALSE(OnSpuriousMessageReceived(msg)) << i; | 
|  | } | 
|  | } |