| Index: chrome/browser/ui/omnibox/omnibox_controller.cc
|
| diff --git a/chrome/browser/ui/omnibox/omnibox_controller.cc b/chrome/browser/ui/omnibox/omnibox_controller.cc
|
| index 48171c6e33cb168f70985c6a6d2160ebd7358a4e..c8ba1c68b2f6abcb39464590fb93ced64a275c94 100644
|
| --- a/chrome/browser/ui/omnibox/omnibox_controller.cc
|
| +++ b/chrome/browser/ui/omnibox/omnibox_controller.cc
|
| @@ -7,6 +7,7 @@
|
| #include "base/metrics/histogram.h"
|
| #include "chrome/browser/autocomplete/autocomplete_classifier.h"
|
| #include "chrome/browser/autocomplete/autocomplete_match.h"
|
| +#include "chrome/browser/autocomplete/search_provider.h"
|
| #include "chrome/browser/net/predictor.h"
|
| #include "chrome/browser/predictors/autocomplete_action_predictor.h"
|
| #include "chrome/browser/prerender/prerender_field_trial.h"
|
| @@ -26,9 +27,11 @@ using predictors::AutocompleteActionPredictor;
|
|
|
|
|
| OmniboxController::OmniboxController(OmniboxEditModel* omnibox_edit_model,
|
| - Profile* profile)
|
| + Profile* profile,
|
| + InstantController* instant_controller)
|
| : omnibox_edit_model_(omnibox_edit_model),
|
| - profile_(profile) {
|
| + profile_(profile),
|
| + instant_controller_(instant_controller) {
|
| autocomplete_controller_.reset(new AutocompleteController(profile, this,
|
| chrome::IsInstantExtendedAPIEnabled() ?
|
| AutocompleteClassifier::kInstantExtendedOmniboxProviders :
|
| @@ -38,6 +41,35 @@ OmniboxController::OmniboxController(OmniboxEditModel* omnibox_edit_model,
|
| OmniboxController::~OmniboxController() {
|
| }
|
|
|
| +void OmniboxController::StartAutocomplete(
|
| + string16 user_text,
|
| + size_t cursor_position,
|
| + bool prevent_inline_autocomplete,
|
| + bool prefer_keyword,
|
| + bool allow_exact_keyword_match) const {
|
| + ClearPopupKeywordMode();
|
| + popup_->SetHoveredLine(OmniboxPopupModel::kNoMatch);
|
| +
|
| + if (instant_controller_) {
|
| + instant_controller_->OnAutocompleteStart();
|
| + // If the embedded page for InstantExtended is fetching its own suggestions,
|
| + // suppress search suggestions from SearchProvider. We still need
|
| + // SearchProvider to run for FinalizeInstantQuery.
|
| + // TODO(dcblack): Once we are done refactoring the omnibox so we don't need
|
| + // to use FinalizeInstantQuery anymore, we can take out this check and
|
| + // remove this provider from kInstantExtendedOmniboxProviders.
|
| + if (instant_controller_->WillFetchCompletions())
|
| + autocomplete_controller_->search_provider()->SuppressSearchSuggestions();
|
| + }
|
| +
|
| + // We don't explicitly clear OmniboxPopupModel::manually_selected_match, as
|
| + // Start ends up invoking OmniboxPopupModel::OnResultChanged which clears it.
|
| + autocomplete_controller_->Start(AutocompleteInput(
|
| + user_text, cursor_position, string16(), GURL(),
|
| + prevent_inline_autocomplete, prefer_keyword, allow_exact_keyword_match,
|
| + AutocompleteInput::ALL_MATCHES));
|
| +}
|
| +
|
| void OmniboxController::OnResultChanged(bool default_match_changed) {
|
| // TODO(beaudoin): There should be no need to access the popup when using
|
| // instant extended, remove this reference.
|
| @@ -79,10 +111,8 @@ void OmniboxController::OnResultChanged(bool default_match_changed) {
|
| // The popup size may have changed, let instant know.
|
| OnPopupBoundsChanged(popup_->view()->GetTargetBounds());
|
|
|
| - InstantController* instant =
|
| - omnibox_edit_model_->controller()->GetInstant();
|
| - if (instant && !omnibox_edit_model_->in_revert()) {
|
| - instant->HandleAutocompleteResults(
|
| + if (instant_controller_ && !omnibox_edit_model_->in_revert()) {
|
| + instant_controller_->HandleAutocompleteResults(
|
| *autocomplete_controller()->providers(),
|
| autocomplete_controller()->result());
|
| }
|
| @@ -95,6 +125,30 @@ void OmniboxController::OnResultChanged(bool default_match_changed) {
|
| }
|
| }
|
|
|
| +bool OmniboxController::DoInstant(const AutocompleteMatch& match,
|
| + string16 user_text,
|
| + string16 full_text,
|
| + size_t selection_start,
|
| + size_t selection_end,
|
| + bool user_input_in_progress,
|
| + bool in_escape_handler,
|
| + bool just_deleted_text,
|
| + bool keyword_is_selected) {
|
| + if (!instant_controller_)
|
| + return false;
|
| +
|
| + // Remove "?" if we're in forced query mode.
|
| + AutocompleteInput::RemoveForcedQueryStringIfNecessary(
|
| + autocomplete_controller_->input().type(), &user_text);
|
| + AutocompleteInput::RemoveForcedQueryStringIfNecessary(
|
| + autocomplete_controller_->input().type(), &full_text);
|
| +
|
| + return instant_controller_->Update(
|
| + match, user_text, full_text, selection_start, selection_end,
|
| + UseVerbatimInstant(just_deleted_text), user_input_in_progress,
|
| + popup_->IsOpen(), in_escape_handler, keyword_is_selected);
|
| +}
|
| +
|
| void OmniboxController::ClearPopupKeywordMode() const {
|
| if (popup_->IsOpen() &&
|
| popup_->selected_line_state() == OmniboxPopupModel::KEYWORD)
|
| @@ -118,7 +172,26 @@ void OmniboxController::DoPreconnect(const AutocompleteMatch& match) {
|
| }
|
|
|
| void OmniboxController::OnPopupBoundsChanged(const gfx::Rect& bounds) {
|
| - InstantController* instant = omnibox_edit_model_->controller()->GetInstant();
|
| - if (instant)
|
| - instant->SetPopupBounds(bounds);
|
| + if (instant_controller_)
|
| + instant_controller_->SetPopupBounds(bounds);
|
| +}
|
| +
|
| +bool OmniboxController::UseVerbatimInstant(bool just_deleted_text) const {
|
| +#if defined(OS_MACOSX)
|
| + // TODO(suzhe): Fix Mac port to display Instant suggest in a separated NSView,
|
| + // so that we can display Instant suggest along with composition text.
|
| + const AutocompleteInput& input = autocomplete_controller()->input();
|
| + if (input.prevent_inline_autocomplete())
|
| + return true;
|
| +#endif
|
| +
|
| + // The value of input.prevent_inline_autocomplete() is determined by the
|
| + // following conditions:
|
| + // 1. If the caret is at the end of the text.
|
| + // 2. If it's in IME composition mode.
|
| + // We send the caret position to Instant (so it can determine #1 itself), and
|
| + // we use a separated widget for displaying the Instant suggest (so it doesn't
|
| + // interfere with #2). So, we don't need to care about the value of
|
| + // input.prevent_inline_autocomplete() here.
|
| + return just_deleted_text || popup_->selected_line() != 0;
|
| }
|
|
|