OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/search/instant_search_prerenderer.h" | 5 #include "chrome/browser/ui/search/instant_search_prerenderer.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/metrics/field_trial.h" | 10 #include "base/metrics/field_trial.h" |
11 #include "base/strings/string16.h" | 11 #include "base/strings/string16.h" |
12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
13 #include "chrome/browser/autocomplete/autocomplete_match.h" | 13 #include "chrome/browser/autocomplete/autocomplete_match.h" |
14 #include "chrome/browser/prerender/prerender_contents.h" | 14 #include "chrome/browser/prerender/prerender_contents.h" |
15 #include "chrome/browser/prerender/prerender_handle.h" | 15 #include "chrome/browser/prerender/prerender_handle.h" |
16 #include "chrome/browser/prerender/prerender_manager.h" | 16 #include "chrome/browser/prerender/prerender_manager.h" |
17 #include "chrome/browser/prerender/prerender_manager_factory.h" | 17 #include "chrome/browser/prerender/prerender_manager_factory.h" |
18 #include "chrome/browser/prerender/prerender_origin.h" | 18 #include "chrome/browser/prerender/prerender_origin.h" |
19 #include "chrome/browser/prerender/prerender_tracker.h" | 19 #include "chrome/browser/prerender/prerender_tracker.h" |
20 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
21 #include "chrome/browser/search/instant_service.h" | 21 #include "chrome/browser/search/instant_service.h" |
22 #include "chrome/browser/search/instant_unittest_base.h" | 22 #include "chrome/browser/search/instant_unittest_base.h" |
23 #include "chrome/browser/search/search.h" | 23 #include "chrome/browser/search/search.h" |
24 #include "chrome/browser/ui/search/search_tab_helper.h" | 24 #include "chrome/browser/ui/search/search_tab_helper.h" |
25 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 25 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
26 #include "chrome/common/render_messages.h" | 26 #include "chrome/common/render_messages.h" |
| 27 #include "chrome/common/url_constants.h" |
27 #include "content/public/browser/navigation_controller.h" | 28 #include "content/public/browser/navigation_controller.h" |
28 #include "content/public/browser/web_contents.h" | 29 #include "content/public/browser/web_contents.h" |
29 #include "content/public/common/url_constants.h" | 30 #include "content/public/common/url_constants.h" |
30 #include "content/public/test/mock_render_process_host.h" | 31 #include "content/public/test/mock_render_process_host.h" |
31 #include "ipc/ipc_message.h" | 32 #include "ipc/ipc_message.h" |
32 #include "ipc/ipc_test_sink.h" | 33 #include "ipc/ipc_test_sink.h" |
33 #include "ui/gfx/size.h" | 34 #include "ui/gfx/size.h" |
34 | 35 |
35 using base::ASCIIToUTF16; | 36 using base::ASCIIToUTF16; |
36 | 37 |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 // Search results page supports Instant search. InstantSearchPrerenderer is | 332 // Search results page supports Instant search. InstantSearchPrerenderer is |
332 // used only when the underlying page doesn't support Instant. | 333 // used only when the underlying page doesn't support Instant. |
333 NavigateAndCommitActiveTab(GURL("https://www.google.com/alt#quux=foo&strk")); | 334 NavigateAndCommitActiveTab(GURL("https://www.google.com/alt#quux=foo&strk")); |
334 active_tab = GetActiveWebContents(); | 335 active_tab = GetActiveWebContents(); |
335 EXPECT_FALSE(chrome::GetSearchTermsFromURL(profile(), active_tab->GetURL()) | 336 EXPECT_FALSE(chrome::GetSearchTermsFromURL(profile(), active_tab->GetURL()) |
336 .empty()); | 337 .empty()); |
337 EXPECT_FALSE(chrome::ShouldPrefetchSearchResultsOnSRP()); | 338 EXPECT_FALSE(chrome::ShouldPrefetchSearchResultsOnSRP()); |
338 EXPECT_FALSE(prerenderer->IsAllowed(search_type_match, active_tab)); | 339 EXPECT_FALSE(prerenderer->IsAllowed(search_type_match, active_tab)); |
339 } | 340 } |
340 | 341 |
| 342 struct SearchURLTestCase { |
| 343 const char* url; |
| 344 const char* expected_result; |
| 345 const char* comment; |
| 346 }; |
| 347 |
| 348 TEST_F(InstantSearchPrerendererTest, GetSearchTermsFromURL) { |
| 349 const SearchURLTestCase kTestCases[] = { |
| 350 {chrome::kChromeSearchLocalNtpUrl, "", "NTP url"}, |
| 351 {"https://foo.com/instant?strk", "", "Invalid search url"}, |
| 352 {"https://foo.com/instant#strk", "", "Invalid search url"}, |
| 353 {"https://www.google.com/alt#quux=foo", "foo", "Valid search url"}, |
| 354 {"https://www.google.com/alt#quux=foo&strk", "foo", "Valid search url"} |
| 355 }; |
| 356 |
| 357 Init(true, true); |
| 358 InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer(); |
| 359 for (size_t i = 0; i < arraysize(kTestCases); ++i) { |
| 360 const SearchURLTestCase& test = kTestCases[i]; |
| 361 EXPECT_EQ( |
| 362 test.expected_result, |
| 363 UTF16ToASCII(prerenderer->GetSearchTermsFromURL(GURL(test.url)))) |
| 364 << test.url << " " << test.comment; |
| 365 } |
| 366 } |
| 367 |
341 TEST_F(InstantSearchPrerendererTest, UsePrerenderPage) { | 368 TEST_F(InstantSearchPrerendererTest, UsePrerenderPage) { |
342 PrerenderSearchQuery(ASCIIToUTF16("foo")); | 369 PrerenderSearchQuery(ASCIIToUTF16("foo")); |
343 | 370 |
344 // Open a search results page. A prerendered page exists for |url|. Make sure | 371 // Open a search results page. A prerendered page exists for |url|. Make sure |
345 // the browser swaps the current tab contents with the prerendered contents. | 372 // the browser swaps the current tab contents with the prerendered contents. |
346 GURL url("https://www.google.com/alt#quux=foo&strk"); | 373 GURL url("https://www.google.com/alt#quux=foo&strk"); |
347 browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB, | 374 browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB, |
348 content::PAGE_TRANSITION_TYPED, | 375 content::PAGE_TRANSITION_TYPED, |
349 false)); | 376 false)); |
350 EXPECT_EQ(GetPrerenderURL(), GetActiveWebContents()->GetURL()); | 377 EXPECT_EQ(GetPrerenderURL(), GetActiveWebContents()->GetURL()); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer(); | 464 InstantSearchPrerenderer* prerenderer = GetInstantSearchPrerenderer(); |
438 base::string16 query = ASCIIToUTF16("flowers"); | 465 base::string16 query = ASCIIToUTF16("flowers"); |
439 prerenderer->Prerender(InstantSuggestion(query, std::string())); | 466 prerenderer->Prerender(InstantSuggestion(query, std::string())); |
440 | 467 |
441 // When the Instant search base page hasn't finished loading, | 468 // When the Instant search base page hasn't finished loading, |
442 // InstantSearchPrerenderer cannot commit any search query to the base page. | 469 // InstantSearchPrerenderer cannot commit any search query to the base page. |
443 EXPECT_FALSE(prerenderer->CanCommitQuery(GetActiveWebContents(), query)); | 470 EXPECT_FALSE(prerenderer->CanCommitQuery(GetActiveWebContents(), query)); |
444 EXPECT_FALSE(prerenderer->CanCommitQuery(GetActiveWebContents(), | 471 EXPECT_FALSE(prerenderer->CanCommitQuery(GetActiveWebContents(), |
445 ASCIIToUTF16("joy"))); | 472 ASCIIToUTF16("joy"))); |
446 } | 473 } |
| 474 |
| 475 class TestUsePrerenderPage : public InstantSearchPrerendererTest { |
| 476 protected: |
| 477 virtual void SetUp() OVERRIDE { |
| 478 // Disable query extraction flag in field trials. |
| 479 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( |
| 480 "EmbeddedSearch", |
| 481 "Group1 strk:20 query_extraction:0 prefetch_results:1")); |
| 482 InstantUnitTestBase::SetUpWithoutQueryExtraction(); |
| 483 } |
| 484 }; |
| 485 |
| 486 TEST_F(TestUsePrerenderPage, ExtractSearchTermsAndUsePrerenderPage) { |
| 487 PrerenderSearchQuery(ASCIIToUTF16("foo")); |
| 488 |
| 489 // Open a search results page. Query extraction flag is disabled in field |
| 490 // trials. Search results page URL does not contain search terms replacement |
| 491 // key. Make sure UsePrerenderedPage() extracts the search terms from the URL |
| 492 // and uses the prerendered page contents. |
| 493 GURL url("https://www.google.com/alt#quux=foo"); |
| 494 browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB, |
| 495 content::PAGE_TRANSITION_TYPED, |
| 496 false)); |
| 497 EXPECT_EQ(GetPrerenderURL(), GetActiveWebContents()->GetURL()); |
| 498 EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle()); |
| 499 } |
OLD | NEW |