1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/api/omnibox/omnibox_api_testbase.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the autocomplete popup doesn't reopen after accepting input for
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// a given query.
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// http://crbug.com/88552
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(OmniboxApiTest, PopupStaysClosed) {
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("omnibox")) << message_;
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The results depend on the TemplateURLService being loaded. Make sure it is
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // loaded so that the autocomplete results are consistent.
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::WaitForTemplateURLServiceToLoad(
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(browser()->profile()));
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LocationBar* location_bar = GetLocationBar(browser());
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OmniboxView* omnibox_view = location_bar->GetLocationEntry();
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteController* autocomplete_controller =
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GetAutocompleteController(browser());
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Input a keyword query and wait for suggestions from the extension.
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  omnibox_view->OnBeforePossibleChange();
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  omnibox_view->SetUserText(ASCIIToUTF16("keyword comman"));
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  omnibox_view->OnAfterPossibleChange();
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WaitForAutocompleteDone(autocomplete_controller);
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(autocomplete_controller->done());
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(popup_model->IsOpen());
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Quickly type another query and accept it before getting suggestions back
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // for the query. The popup will close after accepting input - ensure that it
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // does not reopen when the extension returns its suggestions.
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResultCatcher catcher;
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO: Rather than send this second request by talking to the controller
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // directly, figure out how to send it via the proper calls to
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // location_bar or location_bar->().
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autocomplete_controller->Start(
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutocompleteInput(ASCIIToUTF16("keyword command"), string16::npos,
45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                        string16(), GURL(), AutocompleteInput::NEW_TAB_PAGE,
46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                        true, false, true, AutocompleteInput::ALL_MATCHES));
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  location_bar->AcceptInput();
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WaitForAutocompleteDone(autocomplete_controller);
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(autocomplete_controller->done());
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This checks that the keyword provider (via javascript)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // gets told to navigate to the string "command".
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(popup_model->IsOpen());
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
55