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, &params);
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, &params);
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, &params);
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, &params);
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, &params);
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