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
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CONTROLLER_H_
6#define CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CONTROLLER_H_
7
8#include "base/basictypes.h"
9#include "base/compiler_specific.h"
10#include "base/memory/scoped_ptr.h"
11#include "base/strings/string16.h"
12#include "chrome/browser/autocomplete/autocomplete_controller.h"
13#include "chrome/browser/autocomplete/autocomplete_controller_delegate.h"
14#include "components/omnibox/autocomplete_match.h"
15
16class AUtocompleteInput;
17struct AutocompleteMatch;
18class AutocompleteResult;
19class InstantController;
20class OmniboxEditModel;
21class OmniboxPopupModel;
22class Profile;
23
24namespace gfx {
25class Rect;
26}
27
28// This class controls the various services that can modify the content
29// for the omnibox, including AutocompleteController and InstantController. It
30// is responsible of updating the omnibox content.
31// TODO(beaudoin): Keep on expanding this class so that OmniboxEditModel no
32//     longer needs to hold any reference to AutocompleteController. Also make
33//     this the point of contact between InstantController and OmniboxEditModel.
34//     As the refactor progresses, keep the class comment up-to-date to
35//     precisely explain what this class is doing.
36class OmniboxController : public AutocompleteControllerDelegate {
37 public:
38  OmniboxController(OmniboxEditModel* omnibox_edit_model,
39                    Profile* profile);
40  virtual ~OmniboxController();
41
42  // The |current_url| field of input is only set for mobile ports.
43  void StartAutocomplete(const AutocompleteInput& input) const;
44
45  // AutocompleteControllerDelegate:
46  virtual void OnResultChanged(bool default_match_changed) OVERRIDE;
47
48  AutocompleteController* autocomplete_controller() {
49    return autocomplete_controller_.get();
50  }
51
52  // Set |current_match_| to an invalid value, indicating that we do not yet
53  // have a valid match for the current text in the omnibox.
54  void InvalidateCurrentMatch();
55
56  void set_popup_model(OmniboxPopupModel* popup_model) {
57    popup_ = popup_model;
58  }
59
60  // TODO(beaudoin): The edit and popup model should be siblings owned by the
61  // LocationBarView, making this accessor unnecessary.
62  OmniboxPopupModel* popup_model() const { return popup_; }
63
64  const AutocompleteMatch& current_match() const { return current_match_; }
65
66  // Turns off keyword mode for the current match.
67  void ClearPopupKeywordMode() const;
68
69  const AutocompleteResult& result() const {
70    return autocomplete_controller_->result();
71  }
72
73  // TODO(beaudoin): Make private once OmniboxEditModel no longer refers to it.
74  void DoPreconnect(const AutocompleteMatch& match);
75
76 private:
77  // Weak, it owns us.
78  // TODO(beaudoin): Consider defining a delegate to ease unit testing.
79  OmniboxEditModel* omnibox_edit_model_;
80
81  Profile* profile_;
82
83  OmniboxPopupModel* popup_;
84
85  scoped_ptr<AutocompleteController> autocomplete_controller_;
86
87  // TODO(beaudoin): This AutocompleteMatch is used to let the OmniboxEditModel
88  // know what it should display. Not every field is required for that purpose,
89  // but the ones specifically needed are unclear. We should therefore spend
90  // some time to extract these fields and use a tighter structure here.
91  AutocompleteMatch current_match_;
92
93  DISALLOW_COPY_AND_ASSIGN(OmniboxController);
94};
95
96#endif  // CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CONTROLLER_H_
97