15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_classifier.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/auto_reset.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_controller.h" 96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/metrics/proto/omnibox_event.pb.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_input.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_provider.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int AutocompleteClassifier::kDefaultOmniboxProviders = 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteProvider::TYPE_BOOKMARK | 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteProvider::TYPE_BUILTIN | 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteProvider::TYPE_HISTORY_QUICK | 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteProvider::TYPE_HISTORY_URL | 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteProvider::TYPE_KEYWORD | 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteProvider::TYPE_SEARCH | 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteProvider::TYPE_SHORTCUTS | 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteProvider::TYPE_ZERO_SUGGEST; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26116680a4aac90f2aa7413d9095a592090648e557Ben MurdochAutocompleteClassifier::AutocompleteClassifier( 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<AutocompleteController> controller, 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<AutocompleteSchemeClassifier> scheme_classifier) 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : controller_(controller.Pass()), 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scheme_classifier_(scheme_classifier.Pass()), 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inside_classify_(false) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AutocompleteClassifier::~AutocompleteClassifier() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should only reach here after Shutdown() has been called. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!controller_.get()); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AutocompleteClassifier::Classify( 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& text, 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool prefer_keyword, 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool allow_exact_keyword_match, 436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) metrics::OmniboxEventProto::PageClassification page_classification, 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutocompleteMatch* match, 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL* alternate_nav_url) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!inside_classify_); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<bool> reset(&inside_classify_, true); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->Start(AutocompleteInput( 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) text, base::string16::npos, base::string16(), GURL(), 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) page_classification, true, prefer_keyword, 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch allow_exact_keyword_match, false, *scheme_classifier_)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(controller_->done()); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutocompleteResult& result = controller_->result(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result.empty()) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (alternate_nav_url) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *alternate_nav_url = GURL(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(result.default_match() != result.end()); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *match = *result.default_match(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (alternate_nav_url) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *alternate_nav_url = result.alternate_nav_url(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteClassifier::Shutdown() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.reset(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 69