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