1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 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)#ifndef CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CONTROLLER_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CONTROLLER_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/basictypes.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_controller.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_controller_delegate.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass AUtocompleteInput;
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct AutocompleteMatch;
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class AutocompleteResult;
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class InstantController;
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class OmniboxEditModel;
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class OmniboxPopupModel;
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Profile;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace gfx {
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Rect;
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This class controls the various services that can modify the content
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// for the omnibox, including AutocompleteController and InstantController. It
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// is responsible of updating the omnibox content.
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(beaudoin): Keep on expanding this class so that OmniboxEditModel no
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//     longer needs to hold any reference to AutocompleteController. Also make
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//     this the point of contact between InstantController and OmniboxEditModel.
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//     As the refactor progresses, keep the class comment up-to-date to
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//     precisely explain what this class is doing.
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class OmniboxController : public AutocompleteControllerDelegate {
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  OmniboxController(OmniboxEditModel* omnibox_edit_model,
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    Profile* profile);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~OmniboxController();
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The |current_url| field of input is only set for mobile ports.
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void StartAutocomplete(const AutocompleteInput& input) const;
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AutocompleteControllerDelegate:
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnResultChanged(bool default_match_changed) OVERRIDE;
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteController* autocomplete_controller() {
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return autocomplete_controller_.get();
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Set |current_match_| to an invalid value, indicating that we do not yet
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // have a valid match for the current text in the omnibox.
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void InvalidateCurrentMatch();
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void set_popup_model(OmniboxPopupModel* popup_model) {
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    popup_ = popup_model;
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // TODO(beaudoin): The edit and popup model should be siblings owned by the
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // LocationBarView, making this accessor unnecessary.
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  OmniboxPopupModel* popup_model() const { return popup_; }
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const AutocompleteMatch& current_match() const { return current_match_; }
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Turns off keyword mode for the current match.
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ClearPopupKeywordMode() const;
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const AutocompleteResult& result() const {
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return autocomplete_controller_->result();
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // TODO(beaudoin): Make private once OmniboxEditModel no longer refers to it.
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void DoPreconnect(const AutocompleteMatch& match);
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Weak, it owns us.
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(beaudoin): Consider defining a delegate to ease unit testing.
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OmniboxEditModel* omnibox_edit_model_;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Profile* profile_;
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  OmniboxPopupModel* popup_;
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<AutocompleteController> autocomplete_controller_;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // TODO(beaudoin): This AutocompleteMatch is used to let the OmniboxEditModel
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // know what it should display. Not every field is required for that purpose,
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // but the ones specifically needed are unclear. We should therefore spend
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // some time to extract these fields and use a tighter structure here.
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AutocompleteMatch current_match_;
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OmniboxController);
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CONTROLLER_H_
97