1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file.
4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/search/instant_search_prerenderer.h"
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/basictypes.h"
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/compiler_specific.h"
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/metrics/field_trial.h"
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/strings/string16.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_contents.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_handle.h"
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h"
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_origin.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_tab_helper.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_tracker.h"
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/search/instant_service.h"
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/search/instant_unittest_base.h"
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/search/search.h"
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/search/search_tab_helper.h"
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/common/render_messages.h"
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h"
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/web_contents.h"
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/url_constants.h"
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/test/mock_render_process_host.h"
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ipc/ipc_message.h"
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ipc/ipc_test_sink.h"
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/gfx/size.h"
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace {
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using content::Referrer;
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using prerender::Origin;
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using prerender::PrerenderContents;
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using prerender::PrerenderHandle;
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using prerender::PrerenderManager;
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using prerender::PrerenderManagerFactory;
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using prerender::PrerenderTabHelper;
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class DummyPrerenderContents : public PrerenderContents {
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DummyPrerenderContents(
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      PrerenderManager* prerender_manager,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Profile* profile,
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const GURL& url,
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const Referrer& referrer,
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Origin origin,
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool call_did_finish_load,
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const content::SessionStorageNamespaceMap& session_storage_namespace_map);
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void StartPrerendering(
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      int ALLOW_UNUSED creator_child_id,
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const gfx::Size& ALLOW_UNUSED size,
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::SessionStorageNamespace* session_storage_namespace,
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      net::URLRequestContextGetter* request_context) OVERRIDE;
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool GetChildId(int* child_id) const OVERRIDE;
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool GetRouteId(int* route_id) const OVERRIDE;
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Profile* profile_;
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const GURL url_;
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool call_did_finish_load_;
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::SessionStorageNamespaceMap session_storage_namespace_map_;
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DummyPrerenderContents);
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class DummyPrerenderContentsFactory : public PrerenderContents::Factory {
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DummyPrerenderContentsFactory(
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool call_did_finish_load,
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const content::SessionStorageNamespaceMap& session_storage_namespace_map)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : call_did_finish_load_(call_did_finish_load),
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        session_storage_namespace_map_(session_storage_namespace_map) {
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual PrerenderContents* CreatePrerenderContents(
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      PrerenderManager* prerender_manager,
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      Profile* profile,
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const GURL& url,
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const Referrer& referrer,
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      Origin origin,
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      uint8 experiment_id) OVERRIDE;
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool call_did_finish_load_;
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::SessionStorageNamespaceMap session_storage_namespace_map_;
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DummyPrerenderContentsFactory);
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)DummyPrerenderContents::DummyPrerenderContents(
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    PrerenderManager* prerender_manager,
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Profile* profile,
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const GURL& url,
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const Referrer& referrer,
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Origin origin,
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool call_did_finish_load,
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const content::SessionStorageNamespaceMap& session_storage_namespace_map)
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : PrerenderContents(prerender_manager, profile, url, referrer, origin,
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        PrerenderManager::kNoExperiment),
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      profile_(profile),
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      url_(url),
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      call_did_finish_load_(call_did_finish_load),
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      session_storage_namespace_map_(session_storage_namespace_map) {
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void DummyPrerenderContents::StartPrerendering(
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int ALLOW_UNUSED creator_child_id,
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const gfx::Size& ALLOW_UNUSED size,
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::SessionStorageNamespace* session_storage_namespace,
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    net::URLRequestContextGetter* request_context) {
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender_contents_.reset(content::WebContents::CreateWithSessionStorage(
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::WebContents::CreateParams(profile_),
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      session_storage_namespace_map_));
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrerenderTabHelper::CreateForWebContentsWithPasswordManager(
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prerender_contents_.get(), NULL);
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  content::NavigationController::LoadURLParams params(url_);
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  prerender_contents_->GetController().LoadURLWithParams(params);
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SearchTabHelper::CreateForWebContents(prerender_contents_.get());
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  prerendering_has_started_ = true;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(session_storage_namespace);
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  session_storage_namespace_id_ = session_storage_namespace->id();
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NotifyPrerenderStart();
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (call_did_finish_load_)
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DidFinishLoad(prerender_contents_->GetMainFrame(), url_);
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DummyPrerenderContents::GetChildId(int* child_id) const {
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *child_id = 1;
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DummyPrerenderContents::GetRouteId(int* route_id) const {
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *route_id = 1;
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrerenderContents* DummyPrerenderContentsFactory::CreatePrerenderContents(
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    PrerenderManager* prerender_manager,
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Profile* profile,
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const GURL& url,
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const Referrer& referrer,
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Origin origin,
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    uint8 experiment_id) {
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return new DummyPrerenderContents(prerender_manager, profile, url, referrer,
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    origin, call_did_finish_load_,
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    session_storage_namespace_map_);
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class InstantSearchPrerendererTest : public InstantUnitTestBase {
164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InstantSearchPrerendererTest() {}
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected:
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch",
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                       "Group1 strk:20"));
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    InstantUnitTestBase::SetUp();
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void Init(bool prerender_search_results_base_page,
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            bool call_did_finish_load) {
176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    AddTab(browser(), GURL(url::kAboutBlankURL));
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::SessionStorageNamespaceMap session_storage_namespace_map;
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    session_storage_namespace_map[std::string()] =
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetActiveWebContents()->GetController().
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetDefaultSessionStorageNamespace();
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    PrerenderManagerFactory::GetForProfile(browser()->profile())->
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SetPrerenderContentsFactory(
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            new DummyPrerenderContentsFactory(call_did_finish_load,
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              session_storage_namespace_map));
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrerenderManagerFactory::GetForProfile(browser()->profile())->
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        OnCookieStoreLoaded();
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (prerender_search_results_base_page) {
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prerenderer->Init(session_storage_namespace_map, gfx::Size(640, 480));
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_NE(static_cast<PrerenderHandle*>(NULL), prerender_handle());
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InstantSearchPrerenderer* GetInstantSearchPrerenderer() {
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return instant_service_->instant_search_prerenderer();
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const GURL& GetPrerenderURL() {
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return GetInstantSearchPrerenderer()->prerender_url_;
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetLastQuery(const base::string16& query) {
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    GetInstantSearchPrerenderer()->last_instant_suggestion_ =
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        InstantSuggestion(query, std::string());
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  content::WebContents* prerender_contents() {
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return GetInstantSearchPrerenderer()->prerender_contents();
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool MessageWasSent(uint32 id) {
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    content::MockRenderProcessHost* process =
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        static_cast<content::MockRenderProcessHost*>(
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            prerender_contents()->GetRenderViewHost()->GetProcess());
216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return process->sink().GetFirstMessageMatching(id) != NULL;
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  content::WebContents* GetActiveWebContents() const {
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return browser()->tab_strip_model()->GetWebContentsAt(0);
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  PrerenderHandle* prerender_handle() {
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return GetInstantSearchPrerenderer()->prerender_handle_.get();
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void PrerenderSearchQuery(const base::string16& query) {
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Init(true, true);
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    prerenderer->Prerender(InstantSuggestion(query, std::string()));
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CommitPendingLoad(&prerender_contents()->GetController());
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(prerenderer->CanCommitQuery(GetActiveWebContents(), query));
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_NE(static_cast<PrerenderHandle*>(NULL), prerender_handle());
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest, GetSearchTermsFromPrerenderedPage) {
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Init(false, false);
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  GURL url(GetPrerenderURL());
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(GURL("https://www.google.com/instant?ion=1&foo=foo#foo=foo&strk"),
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            url);
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(base::UTF16ToASCII(prerenderer->get_last_query()),
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            base::UTF16ToASCII(
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                chrome::ExtractSearchTermsFromURL(profile(), url)));
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Assume the prerendered page prefetched search results for the query
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // "flowers".
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetLastQuery(ASCIIToUTF16("flowers"));
250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("flowers", base::UTF16ToASCII(prerenderer->get_last_query()));
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(base::UTF16ToASCII(prerenderer->get_last_query()),
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            base::UTF16ToASCII(
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                chrome::ExtractSearchTermsFromURL(profile(), url)));
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest, PrefetchSearchResults) {
257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Init(true, true);
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(prerender_handle()->IsFinishedLoading());
259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  prerenderer->Prerender(
261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      InstantSuggestion(ASCIIToUTF16("flowers"), std::string()));
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("flowers", base::UTF16ToASCII(prerenderer->get_last_query()));
263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(MessageWasSent(
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ChromeViewMsg_SearchBoxSetSuggestionToPrefetch::ID));
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest, DoNotPrefetchSearchResults) {
268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Init(true, false);
269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Page hasn't finished loading yet.
270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(prerender_handle()->IsFinishedLoading());
271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  prerenderer->Prerender(
273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      InstantSuggestion(ASCIIToUTF16("flowers"), std::string()));
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("", base::UTF16ToASCII(prerenderer->get_last_query()));
275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(MessageWasSent(
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ChromeViewMsg_SearchBoxSetSuggestionToPrefetch::ID));
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest, CanCommitQuery) {
280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Init(true, true);
281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 query = ASCIIToUTF16("flowers");
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  prerenderer->Prerender(InstantSuggestion(query, std::string()));
284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(prerenderer->CanCommitQuery(GetActiveWebContents(), query));
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Make sure InstantSearchPrerenderer::CanCommitQuery() returns false for
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // invalid search queries.
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(prerenderer->CanCommitQuery(GetActiveWebContents(),
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          ASCIIToUTF16("joy")));
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(prerenderer->CanCommitQuery(GetActiveWebContents(),
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           base::string16()));
292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest, CommitQuery) {
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 query = ASCIIToUTF16("flowers");
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrerenderSearchQuery(query);
297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  prerenderer->Commit(query);
299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(MessageWasSent(ChromeViewMsg_SearchBoxSubmit::ID));
300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest, CancelPrerenderRequestOnTabChangeEvent) {
303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Init(true, true);
304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_NE(static_cast<PrerenderHandle*>(NULL), prerender_handle());
305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Add a new tab to deactivate the current tab.
307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AddTab(browser(), GURL(url::kAboutBlankURL));
308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Make sure the pending prerender request is cancelled.
311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest, CancelPendingPrerenderRequest) {
315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Init(true, true);
316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_NE(static_cast<PrerenderHandle*>(NULL), prerender_handle());
317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  prerenderer->Cancel();
320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest, PrerenderingAllowed) {
324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Init(true, true);
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  content::WebContents* active_tab = GetActiveWebContents();
327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(GURL(url::kAboutBlankURL), active_tab->GetURL());
328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Allow prerendering only for search type AutocompleteMatch suggestions.
330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AutocompleteMatch search_type_match(NULL, 1100, false,
331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                      AutocompleteMatchType::SEARCH_SUGGEST);
332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(AutocompleteMatch::IsSearchType(search_type_match.type));
333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(prerenderer->IsAllowed(search_type_match, active_tab));
334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AutocompleteMatch url_type_match(NULL, 1100, true,
336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                   AutocompleteMatchType::URL_WHAT_YOU_TYPED);
337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(AutocompleteMatch::IsSearchType(url_type_match.type));
338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(prerenderer->IsAllowed(url_type_match, active_tab));
339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Search results page supports Instant search. InstantSearchPrerenderer is
341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // used only when the underlying page doesn't support Instant.
342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NavigateAndCommitActiveTab(GURL("https://www.google.com/alt#quux=foo&strk"));
343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  active_tab = GetActiveWebContents();
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(chrome::ExtractSearchTermsFromURL(profile(),
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 active_tab->GetURL()).empty());
346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(chrome::ShouldPrefetchSearchResultsOnSRP());
347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(prerenderer->IsAllowed(search_type_match, active_tab));
348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest, UsePrerenderPage) {
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrerenderSearchQuery(ASCIIToUTF16("foo"));
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Open a search results page. A prerendered page exists for |url|. Make sure
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the browser swaps the current tab contents with the prerendered contents.
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url("https://www.google.com/alt#quux=foo&strk");
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB,
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            ui::PAGE_TRANSITION_TYPED,
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            false));
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(GetPrerenderURL(), GetActiveWebContents()->GetURL());
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest, PrerenderRequestCancelled) {
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrerenderSearchQuery(ASCIIToUTF16("foo"));
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Cancel the prerender request.
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerenderer->Cancel();
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Open a search results page. Prerendered page does not exists for |url|.
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Make sure the browser navigates the current tab to this |url|.
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url("https://www.google.com/alt#quux=foo&strk");
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB,
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            ui::PAGE_TRANSITION_TYPED,
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            false));
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(GetPrerenderURL(), GetActiveWebContents()->GetURL());
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(url, GetActiveWebContents()->GetURL());
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest,
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       UsePrerenderedPage_SearchQueryMistmatch) {
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrerenderSearchQuery(ASCIIToUTF16("foo"));
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Open a search results page. Committed query("pen") doesn't match with the
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // prerendered search query("foo"). Make sure the browser swaps the current
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // tab contents with the prerendered contents.
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url("https://www.google.com/alt#quux=pen&strk");
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB,
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            ui::PAGE_TRANSITION_TYPED,
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            false));
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(GetPrerenderURL(), GetActiveWebContents()->GetURL());
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(InstantSearchPrerendererTest,
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       CancelPrerenderRequest_EmptySearchQueryCommitted) {
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrerenderSearchQuery(ASCIIToUTF16("foo"));
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Open a search results page. Make sure the InstantSearchPrerenderer cancels
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the active prerender request upon the receipt of empty search query.
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url("https://www.google.com/alt#quux=&strk");
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB,
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            ui::PAGE_TRANSITION_TYPED,
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            false));
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(GetPrerenderURL(), GetActiveWebContents()->GetURL());
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(url, GetActiveWebContents()->GetURL());
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
411116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(InstantSearchPrerendererTest,
412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       CancelPrerenderRequest_UnsupportedDispositions) {
413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PrerenderSearchQuery(ASCIIToUTF16("pen"));
414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Open a search results page. Make sure the InstantSearchPrerenderer cancels
416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // the active prerender request for unsupported window dispositions.
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GURL url("https://www.google.com/alt#quux=pen&strk");
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  browser()->OpenURL(content::OpenURLParams(url, Referrer(), NEW_FOREGROUND_TAB,
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            ui::PAGE_TRANSITION_TYPED,
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            false));
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::WebContents* new_tab =
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      browser()->tab_strip_model()->GetWebContentsAt(1);
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_NE(GetPrerenderURL(), new_tab->GetURL());
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(url, new_tab->GetURL());
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ReuseInstantSearchBasePageTest : public InstantSearchPrerendererTest {
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  public:
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   ReuseInstantSearchBasePageTest() {}
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  protected:
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   virtual void SetUp() OVERRIDE {
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("EmbeddedSearch",
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                       "Group1 strk:20"));
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InstantUnitTestBase::SetUp();
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   }
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ReuseInstantSearchBasePageTest, CanCommitQuery) {
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Init(true, true);
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 query = ASCIIToUTF16("flowers");
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerenderer->Prerender(InstantSuggestion(query, std::string()));
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(prerenderer->CanCommitQuery(GetActiveWebContents(), query));
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // When the Instant search base page has finished loading,
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // InstantSearchPrerenderer can commit any search query to the prerendered
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // page (even if it doesn't match the last known suggestion query).
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(prerenderer->CanCommitQuery(GetActiveWebContents(),
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           ASCIIToUTF16("joy")));
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Invalid search query committed.
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(prerenderer->CanCommitQuery(GetActiveWebContents(),
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           base::string16()));
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ReuseInstantSearchBasePageTest,
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       CanCommitQuery_InstantSearchBasePageLoadInProgress) {
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Init(true, false);
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer();
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 query = ASCIIToUTF16("flowers");
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerenderer->Prerender(InstantSuggestion(query, std::string()));
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // When the Instant search base page hasn't finished loading,
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // InstantSearchPrerenderer cannot commit any search query to the base page.
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(prerenderer->CanCommitQuery(GetActiveWebContents(), query));
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(prerenderer->CanCommitQuery(GetActiveWebContents(),
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           ASCIIToUTF16("joy")));
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_IOS) && !defined(OS_ANDROID)
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestUsePrerenderPage : public InstantSearchPrerendererTest {
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Disable query extraction flag in field trials.
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "EmbeddedSearch", "Group1 strk:20 query_extraction:0"));
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InstantUnitTestBase::SetUpWithoutQueryExtraction();
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TestUsePrerenderPage, ExtractSearchTermsAndUsePrerenderPage) {
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrerenderSearchQuery(ASCIIToUTF16("foo"));
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Open a search results page. Query extraction flag is disabled in field
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // trials. Search results page URL does not contain search terms replacement
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // key. Make sure UsePrerenderedPage() extracts the search terms from the URL
4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // and uses the prerendered page contents.
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url("https://www.google.com/alt#quux=foo");
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB,
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            ui::PAGE_TRANSITION_TYPED,
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            false));
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(GetPrerenderURL(), GetActiveWebContents()->GetURL());
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
497