158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/search/search_tab_helper.h" 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/command_line.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/metrics/field_trial.h" 100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/prerender/prerender_manager.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/prerender/prerender_manager_factory.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/search/instant_unittest_base.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/search/search.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h" 160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/signin/fake_signin_manager.h" 170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_mock.h" 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/search/search_ipc_router.h" 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/ntp_logging_events.h" 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/omnibox_focus_state.h" 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/render_messages.h" 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/url_constants.h" 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/test/base/browser_with_test_window_test.h" 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h" 310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h" 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/navigation_controller.h" 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/navigation_entry.h" 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/web_contents.h" 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/mock_render_process_host.h" 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ipc/ipc_message.h" 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ipc/ipc_test_sink.h" 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/net_errors.h" 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "url/gurl.h" 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass OmniboxView; 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using testing::Return; 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace { 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MockSearchIPCRouterDelegate : public SearchIPCRouter::Delegate { 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~MockSearchIPCRouterDelegate() {} 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MOCK_METHOD1(OnInstantSupportDetermined, void(bool supports_instant)); 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MOCK_METHOD1(OnSetVoiceSearchSupport, void(bool supports_voice_search)); 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MOCK_METHOD1(FocusOmnibox, void(OmniboxFocusState state)); 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) MOCK_METHOD3(NavigateToURL, void(const GURL&, WindowOpenDisposition, bool)); 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MOCK_METHOD1(OnDeleteMostVisitedItem, void(const GURL& url)); 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MOCK_METHOD1(OnUndoMostVisitedDeletion, void(const GURL& url)); 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MOCK_METHOD0(OnUndoAllMostVisitedDeletions, void()); 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MOCK_METHOD1(OnLogEvent, void(NTPLoggingEventType event)); 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MOCK_METHOD2(OnLogMostVisitedImpression, 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void(int position, const base::string16& provider)); 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MOCK_METHOD2(OnLogMostVisitedNavigation, 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void(int position, const base::string16& provider)); 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MOCK_METHOD1(PasteIntoOmnibox, void(const base::string16&)); 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MOCK_METHOD1(OnChromeIdentityCheck, void(const base::string16& identity)); 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class SearchTabHelperTest : public ChromeRenderViewHostTestHarness { 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetUp() { 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ChromeRenderViewHostTestHarness::SetUp(); 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SearchTabHelper::CreateForWebContents(web_contents()); 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual content::BrowserContext* CreateBrowserContext() OVERRIDE { 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TestingProfile::Builder builder; 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch builder.AddTestingFactory(SigninManagerFactory::GetInstance(), 84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FakeSigninManagerBase::Build); 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) builder.AddTestingFactory( 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ProfileSyncServiceFactory::GetInstance(), 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ProfileSyncServiceMock::BuildMockProfileSyncService); 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return builder.Build().release(); 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Creates a sign-in manager for tests. If |username| is not empty, the 920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // testing profile of the WebContents will be connected to the given account. 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The account can be configured to |sync_history| or not. 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void CreateSigninManager(const std::string& username, bool sync_history) { 950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SigninManagerBase* signin_manager = static_cast<SigninManagerBase*>( 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SigninManagerFactory::GetForProfile(profile())); 970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!username.empty()) { 990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_TRUE(signin_manager); 1000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) signin_manager->SetAuthenticatedUsername(username); 1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ProfileSyncServiceMock* sync_service = static_cast<ProfileSyncServiceMock*>( 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile())); 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*sync_service, sync_initialized()).WillRepeatedly(Return(true)); 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::ModelTypeSet result; 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (sync_history) { 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result.Put(syncer::HISTORY_DELETE_DIRECTIVES); 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*sync_service, GetActiveDataTypes()) 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .WillRepeatedly(Return(result)); 1130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool MessageWasSent(uint32 id) { 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return process()->sink().GetFirstMessageMatching(id) != NULL; 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MockSearchIPCRouterDelegate* mock_delegate() { return &delegate_; } 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MockSearchIPCRouterDelegate delegate_; 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(SearchTabHelperTest, DetermineIfPageSupportsInstant_Local) { 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NavigateAndCommit(GURL(chrome::kChromeSearchLocalNtpUrl)); 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(*mock_delegate(), OnInstantSupportDetermined(true)).Times(0); 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SearchTabHelper* search_tab_helper = 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SearchTabHelper::FromWebContents(web_contents()); 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) search_tab_helper->ipc_router().set_delegate_for_testing(mock_delegate()); 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) search_tab_helper->DetermineIfPageSupportsInstant(); 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(SearchTabHelperTest, DetermineIfPageSupportsInstant_NonLocal) { 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NavigateAndCommit(GURL("chrome-search://foo/bar")); 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) process()->sink().ClearMessages(); 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(*mock_delegate(), OnInstantSupportDetermined(true)).Times(1); 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SearchTabHelper* search_tab_helper = 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SearchTabHelper::FromWebContents(web_contents()); 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) search_tab_helper->ipc_router().set_delegate_for_testing(mock_delegate()); 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) search_tab_helper->DetermineIfPageSupportsInstant(); 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(MessageWasSent(ChromeViewMsg_DetermineIfPageSupportsInstant::ID)); 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<IPC::Message> response( 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new ChromeViewHostMsg_InstantSupportDetermined( 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) web_contents()->GetRoutingID(), 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) search_tab_helper->ipc_router().page_seq_no_for_testing(), 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) true)); 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) search_tab_helper->ipc_router().OnMessageReceived(*response); 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(SearchTabHelperTest, PageURLDoesntBelongToInstantRenderer) { 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Navigate to a page URL that doesn't belong to Instant renderer. 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // SearchTabHelper::DeterminerIfPageSupportsInstant() should return 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // immediately without dispatching any message to the renderer. 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NavigateAndCommit(GURL("http://www.example.com")); 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) process()->sink().ClearMessages(); 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(*mock_delegate(), OnInstantSupportDetermined(false)).Times(0); 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SearchTabHelper* search_tab_helper = 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SearchTabHelper::FromWebContents(web_contents()); 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) search_tab_helper->ipc_router().set_delegate_for_testing(mock_delegate()); 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) search_tab_helper->DetermineIfPageSupportsInstant(); 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_FALSE(MessageWasSent( 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ChromeViewMsg_DetermineIfPageSupportsInstant::ID)); 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TEST_F(SearchTabHelperTest, OnChromeIdentityCheckMatch) { 1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NavigateAndCommit(GURL(chrome::kChromeSearchLocalNtpUrl)); 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CreateSigninManager(std::string("foo@bar.com"), true); 1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SearchTabHelper* search_tab_helper = 1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SearchTabHelper::FromWebContents(web_contents()); 1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); 1790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16 test_identity = base::ASCIIToUTF16("foo@bar.com"); 1810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) search_tab_helper->OnChromeIdentityCheck(test_identity); 1820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const IPC::Message* message = process()->sink().GetUniqueMessageMatching( 1840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::ID); 1850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_TRUE(message != NULL); 1860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::Param params; 1880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::Read(message, ¶ms); 1890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(test_identity, params.a); 1900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_TRUE(params.b); 1910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 1920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TEST_F(SearchTabHelperTest, OnChromeIdentityCheckMismatch) { 1940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NavigateAndCommit(GURL(chrome::kChromeSearchLocalNtpUrl)); 195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CreateSigninManager(std::string("foo@bar.com"), true); 1960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SearchTabHelper* search_tab_helper = 1970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SearchTabHelper::FromWebContents(web_contents()); 1980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); 1990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16 test_identity = base::ASCIIToUTF16("bar@foo.com"); 2010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) search_tab_helper->OnChromeIdentityCheck(test_identity); 2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const IPC::Message* message = process()->sink().GetUniqueMessageMatching( 2040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::ID); 2050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_TRUE(message != NULL); 2060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::Param params; 2080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::Read(message, ¶ms); 2090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(test_identity, params.a); 2100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_FALSE(params.b); 2110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 2120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TEST_F(SearchTabHelperTest, OnChromeIdentityCheckSignedOutMatch) { 2140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NavigateAndCommit(GURL(chrome::kChromeSearchLocalNtpUrl)); 2150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // This test does not sign in. 216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ProfileSyncServiceMock* sync_service = static_cast<ProfileSyncServiceMock*>( 217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile())); 218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*sync_service, sync_initialized()).WillRepeatedly(Return(false)); 2190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SearchTabHelper* search_tab_helper = 2200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SearchTabHelper::FromWebContents(web_contents()); 2210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); 2220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 test_identity; 2240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) search_tab_helper->OnChromeIdentityCheck(test_identity); 2250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const IPC::Message* message = process()->sink().GetUniqueMessageMatching( 2270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::ID); 2280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_TRUE(message != NULL); 2290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::Param params; 2310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::Read(message, ¶ms); 2320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(test_identity, params.a); 233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(params.b); 2340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 2350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TEST_F(SearchTabHelperTest, OnChromeIdentityCheckSignedOutMismatch) { 2370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NavigateAndCommit(GURL(chrome::kChromeSearchLocalNtpUrl)); 2380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // This test does not sign in. 239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ProfileSyncServiceMock* sync_service = static_cast<ProfileSyncServiceMock*>( 240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile())); 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*sync_service, sync_initialized()).WillRepeatedly(Return(false)); 2420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SearchTabHelper* search_tab_helper = 2430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SearchTabHelper::FromWebContents(web_contents()); 2440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); 2450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16 test_identity = base::ASCIIToUTF16("bar@foo.com"); 2470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) search_tab_helper->OnChromeIdentityCheck(test_identity); 2480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const IPC::Message* message = process()->sink().GetUniqueMessageMatching( 2500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::ID); 2510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_TRUE(message != NULL); 2520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::Param params; 2540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::Read(message, ¶ms); 2550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(test_identity, params.a); 2560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_FALSE(params.b); 2570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SearchTabHelperTest, OnChromeIdentityCheckMatchNotSyncing) { 260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NavigateAndCommit(GURL(chrome::kChromeSearchLocalNtpUrl)); 261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CreateSigninManager(std::string("foo@bar.com"), false); 262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SearchTabHelper* search_tab_helper = 263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SearchTabHelper::FromWebContents(web_contents()); 264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); 265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::string16 test_identity = base::ASCIIToUTF16("foo@bar.com"); 267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) search_tab_helper->OnChromeIdentityCheck(test_identity); 268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const IPC::Message* message = process()->sink().GetUniqueMessageMatching( 270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::ID); 271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(message != NULL); 272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::Param params; 274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ChromeViewMsg_ChromeIdentityCheckResult::Read(message, ¶ms); 275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(test_identity, params.a); 276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(params.b); 277f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 278f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TabTitleObserver : public content::WebContentsObserver { 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) explicit TabTitleObserver(content::WebContents* contents) 282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : WebContentsObserver(contents) {} 283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title_on_start() { return title_on_start_; } 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title_on_commit() { return title_on_commit_; } 286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidStartProvisionalLoadForFrame( 289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* /* render_frame_host */, 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& /* validated_url */, 291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool /* is_error_page */, 292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool /* is_iframe_srcdoc */) OVERRIDE { 293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) title_on_start_ = web_contents()->GetTitle(); 294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidNavigateMainFrame( 297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const content::LoadCommittedDetails& /* details */, 298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const content::FrameNavigateParams& /* params */) OVERRIDE { 299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) title_on_commit_ = web_contents()->GetTitle(); 300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title_on_start_; 303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title_on_commit_; 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(SearchTabHelperTest, TitleIsSetForNTP) { 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TabTitleObserver title_observer(web_contents()); 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateAndCommit(GURL(chrome::kChromeUINewTabURL)); 309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 title = l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE); 310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(title, title_observer.title_on_start()); 311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(title, title_observer.title_on_commit()); 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(title, web_contents()->GetTitle()); 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class SearchTabHelperWindowTest : public BrowserWithTestWindowTest { 316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected: 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetUp() OVERRIDE { 318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BrowserWithTestWindowTest::SetUp(); 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) profile(), &TemplateURLServiceFactory::BuildInstanceFor); 321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TemplateURLService* template_url_service = 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TemplateURLServiceFactory::GetForProfile(profile()); 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui_test_utils::WaitForTemplateURLServiceToLoad(template_url_service); 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TemplateURLData data; 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) data.SetURL("http://foo.com/url?bar={searchTerms}"); 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) data.instant_url = "http://foo.com/instant?" 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "{google:omniboxStartMarginParameter}{google:forceInstantResults}" 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "foo=foo#foo=foo&strk"; 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) data.new_tab_url = std::string("https://foo.com/newtab?strk"); 331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) data.alternate_urls.push_back("http://foo.com/alt#quux={searchTerms}"); 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) data.search_terms_replacement_key = "strk"; 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TemplateURL* template_url = new TemplateURL(data); 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) template_url_service->Add(template_url); 3365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu template_url_service->SetUserSelectedDefaultSearchProvider(template_url); 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(SearchTabHelperWindowTest, OnProvisionalLoadFailRedirectNTPToLocal) { 341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AddTab(browser(), GURL(chrome::kChromeUINewTabURL)); 342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::WebContents* contents = 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser()->tab_strip_model()->GetWebContentsAt(0); 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::NavigationController* controller = &contents->GetController(); 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SearchTabHelper* search_tab_helper = 347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SearchTabHelper::FromWebContents(contents); 348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A failed provisional load of a cacheable NTP should be redirected to local 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // NTP. 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL cacheableNTPURL = chrome::GetNewTabPageURL(profile()); 353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch search_tab_helper->DidFailProvisionalLoad( 354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch contents->GetMainFrame(), cacheableNTPURL, 1, base::string16()); 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CommitPendingLoad(controller); 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(GURL(chrome::kChromeSearchLocalNtpUrl), 357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) controller->GetLastCommittedEntry()->GetURL()); 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(SearchTabHelperWindowTest, OnProvisionalLoadFailDontRedirectIfAborted) { 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddTab(browser(), GURL("chrome://blank")); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* contents = 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser()->tab_strip_model()->GetWebContentsAt(0); 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NavigationController* controller = &contents->GetController(); 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SearchTabHelper* search_tab_helper = 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SearchTabHelper::FromWebContents(contents); 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A failed provisional load of a cacheable NTP should be redirected to local 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NTP. 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL cacheableNTPURL = chrome::GetNewTabPageURL(profile()); 373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch search_tab_helper->DidFailProvisionalLoad(contents->GetMainFrame(), 374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cacheableNTPURL, 375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::ERR_ABORTED, 376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16()); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CommitPendingLoad(controller); 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(GURL("chrome://blank"), 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller->GetLastCommittedEntry()->GetURL()); 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(SearchTabHelperWindowTest, OnProvisionalLoadFailDontRedirectNonNTP) { 383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AddTab(browser(), GURL(chrome::kChromeUINewTabURL)); 384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::WebContents* contents = 385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser()->tab_strip_model()->GetWebContentsAt(0); 386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::NavigationController* controller = &contents->GetController(); 387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SearchTabHelper* search_tab_helper = 389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SearchTabHelper::FromWebContents(contents); 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_NE(static_cast<SearchTabHelper*>(NULL), search_tab_helper); 391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Any other web page shouldn't be redirected when provisional load fails. 393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch search_tab_helper->DidFailProvisionalLoad(contents->GetMainFrame(), 394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL("http://www.example.com"), 395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1, 396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16()); 397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CommitPendingLoad(controller); 398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_NE(GURL(chrome::kChromeSearchLocalNtpUrl), 399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) controller->GetLastCommittedEntry()->GetURL()); 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 402116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass SearchTabHelperPrerenderTest : public InstantUnitTestBase { 403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~SearchTabHelperPrerenderTest() {} 405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected: 407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void SetUp() OVERRIDE { 408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( 409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "EmbeddedSearch", 410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "Group1 espv:89 prefetch_results:1 " 411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "prerender_instant_url_on_omnibox_focus:1")); 412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InstantUnitTestBase::SetUp(); 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddTab(browser(), GURL(chrome::kChromeUINewTabURL)); 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prerender::PrerenderManagerFactory::GetForProfile(browser()->profile())-> 416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnCookieStoreLoaded(); 417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SearchTabHelper::FromWebContents(web_contents())->set_omnibox_has_focus_fn( 418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch omnibox_has_focus); 419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SearchTabHelperPrerenderTest::omnibox_has_focus_ = true; 420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::WebContents* web_contents() { 423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return browser()->tab_strip_model()->GetActiveWebContents(); 424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool IsInstantURLMarkedForPrerendering() { 427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL instant_url(chrome::GetSearchResultPrefetchBaseURL(profile())); 428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prerender::PrerenderManager* prerender_manager = 429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prerender::PrerenderManagerFactory::GetForProfile(profile()); 430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return prerender_manager->HasPrerenderedUrl(instant_url, web_contents()); 431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static bool omnibox_has_focus(OmniboxView* omnibox) { 434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return omnibox_has_focus_; 435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static bool omnibox_has_focus_; 438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 440116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool SearchTabHelperPrerenderTest::omnibox_has_focus_ = true; 441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 442116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SearchTabHelperPrerenderTest, OnOmniboxFocusPrerenderInstantURL) { 443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SearchTabHelper* search_tab_helper = 444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SearchTabHelper::FromWebContents(web_contents()); 445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch search_tab_helper->OmniboxFocusChanged(OMNIBOX_FOCUS_VISIBLE, 446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OMNIBOX_FOCUS_CHANGE_EXPLICIT); 447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(IsInstantURLMarkedForPrerendering()); 448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch search_tab_helper->OmniboxFocusChanged(OMNIBOX_FOCUS_NONE, 449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OMNIBOX_FOCUS_CHANGE_EXPLICIT); 450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_FALSE(IsInstantURLMarkedForPrerendering()); 451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 453116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SearchTabHelperPrerenderTest, OnTabActivatedPrerenderInstantURL) { 454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SearchTabHelper* search_tab_helper = 455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SearchTabHelper::FromWebContents(web_contents()); 456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch search_tab_helper->OnTabActivated(); 457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(IsInstantURLMarkedForPrerendering()); 458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 460116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SearchTabHelperPrerenderTest, 461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnTabActivatedNoPrerenderIfOmniboxBlurred) { 462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SearchTabHelperPrerenderTest::omnibox_has_focus_ = false; 463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SearchTabHelper* search_tab_helper = 464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SearchTabHelper::FromWebContents(web_contents()); 465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch search_tab_helper->OnTabActivated(); 466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_FALSE(IsInstantURLMarkedForPrerendering()); 467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 468