Commit 741314c6 authored by mukai@chromium.org's avatar mukai@chromium.org

Add basic support of URL/search query to Athena home card.

It still takes time to componentize autocomplete input and search
features. However, we have componentized some important parts
already. The added code will be replaced by the real autocomplete
code in the future, but meanwhile, this is good enough.

Feature:
- the logic to check if the input looks like URL / host names
- canonicalize the input to form the actual URL (http://...)
- use TemplateURLService to create the search result page URL
  if it looks like a query.

BUG=387207
R=oshima@chromium.org, hashimoto@chromium.org
TBR=pkasting@chromium.org, jar@chromium.org
TEST=manually

Review URL: https://codereview.chromium.org/382683002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282497 0039d316-1c4b-4281-b951-d872f2087c98
parent 20164ce4
...@@ -7,7 +7,11 @@ include_rules = [ ...@@ -7,7 +7,11 @@ include_rules = [
"+athena/task/public", "+athena/task/public",
"+athena/virtual_keyboard/public", "+athena/virtual_keyboard/public",
"+athena/wm/public", "+athena/wm/public",
"+components/autocomplete",
"+components/metrics/proto",
"+components/search_engines",
"+content/public", "+content/public",
"+net",
"+ui/aura", "+ui/aura",
"+ui/app_list", "+ui/app_list",
"+ui/base", "+ui/base",
......
...@@ -17,6 +17,14 @@ ...@@ -17,6 +17,14 @@
'../../apps/shell/app_shell.gyp:app_shell_lib', '../../apps/shell/app_shell.gyp:app_shell_lib',
'../../ash/ash_resources.gyp:ash_resources', '../../ash/ash_resources.gyp:ash_resources',
'../../chromeos/chromeos.gyp:power_manager_proto', '../../chromeos/chromeos.gyp:power_manager_proto',
'../../components/components.gyp:autocomplete',
'../../components/components.gyp:component_metrics_proto',
'../../components/components.gyp:history_core_browser',
# infobars_test_support is required to declare some symbols used in the
# search_engines and its dependencies. See crbug.com/386171
# TODO(mukai): declare those symbols for Athena.
'../../components/components.gyp:infobars_test_support',
'../../components/components.gyp:search_engines',
'../../skia/skia.gyp:skia', '../../skia/skia.gyp:skia',
'../../ui/accessibility/accessibility.gyp:ax_gen', '../../ui/accessibility/accessibility.gyp:ax_gen',
'../../ui/app_list/app_list.gyp:app_list', '../../ui/app_list/app_list.gyp:app_list',
......
...@@ -7,6 +7,15 @@ ...@@ -7,6 +7,15 @@
#include "athena/activity/public/activity_factory.h" #include "athena/activity/public/activity_factory.h"
#include "athena/activity/public/activity_manager.h" #include "athena/activity/public/activity_manager.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "components/autocomplete/autocomplete_input.h"
#include "components/autocomplete/autocomplete_scheme_classifier.h"
#include "components/metrics/proto/omnibox_event.pb.h"
#include "components/metrics/proto/omnibox_input_type.pb.h"
#include "components/search_engines/search_terms_data.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_service.h"
#include "components/search_engines/template_url_service_client.h"
#include "net/url_request/url_request.h"
#include "ui/app_list/search_result.h" #include "ui/app_list/search_result.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -14,15 +23,67 @@ namespace athena { ...@@ -14,15 +23,67 @@ namespace athena {
namespace { namespace {
// The AutocompleteSchemeClassifier implementation for Athena.
// TODO(mukai): Introduce supports of normal schemes like about: or blob:
class AthenaSchemeClassifier : public AutocompleteSchemeClassifier {
public:
AthenaSchemeClassifier() {}
// AutocompleteSchemeClassifier:
virtual metrics::OmniboxInputType::Type GetInputTypeForScheme(
const std::string& scheme) const OVERRIDE {
if (net::URLRequest::IsHandledProtocol(scheme))
return metrics::OmniboxInputType::URL;
return metrics::OmniboxInputType::INVALID;
}
};
// The templateURLServiceClient for Athena. Mainly for the interaction with
// history module (see chrome/browser/search_engines for Chrome implementation).
// TODO(mukai): Implement the contents of this class when it's necessary.
class AthenaTemplateURLServiceClient : public TemplateURLServiceClient {
public:
AthenaTemplateURLServiceClient() {}
virtual ~AthenaTemplateURLServiceClient() {}
private:
// TemplateURLServiceClient:
virtual void SetOwner(TemplateURLService* owner) OVERRIDE {}
virtual void DeleteAllSearchTermsForKeyword(TemplateURLID id) OVERRIDE {}
virtual void SetKeywordSearchTermsForURL(
const GURL& url,
TemplateURLID id,
const base::string16& term) OVERRIDE {}
virtual void AddKeywordGeneratedVisit(const GURL& url) OVERRIDE {}
DISALLOW_COPY_AND_ASSIGN(AthenaTemplateURLServiceClient);
};
class UrlSearchResult : public app_list::SearchResult { class UrlSearchResult : public app_list::SearchResult {
public: public:
UrlSearchResult(content::BrowserContext* browser_context, UrlSearchResult(content::BrowserContext* browser_context,
TemplateURLService* template_url_service,
const base::string16& query) const base::string16& query)
: browser_context_(browser_context), url_(query) { : browser_context_(browser_context),
template_url_service_(template_url_service),
input_(query,
base::string16::npos /* cursor_position */,
base::string16() /* desired_tld */,
GURL() /* current_url */,
metrics::OmniboxEventProto::INVALID_SPEC,
false /* prevent_inline_autocomplete */,
false /* prefer_keyword */,
true /* allow_extract_keyword_match */,
true /* want_asynchronous_matches */,
AthenaSchemeClassifier()) {
set_title(query); set_title(query);
app_list::SearchResult::Tags title_tags; app_list::SearchResult::Tags title_tags;
if (input_.type() == metrics::OmniboxInputType::URL) {
title_tags.push_back(app_list::SearchResult::Tag(
app_list::SearchResult::Tag::URL, 0, query.size()));
}
title_tags.push_back(app_list::SearchResult::Tag( title_tags.push_back(app_list::SearchResult::Tag(
app_list::SearchResult::Tag::URL, 0, query.size())); app_list::SearchResult::Tag::MATCH, 0, query.size()));
set_title_tags(title_tags); set_title_tags(title_tags);
set_id(base::UTF16ToUTF8(query)); set_id(base::UTF16ToUTF8(query));
} }
...@@ -30,12 +91,24 @@ class UrlSearchResult : public app_list::SearchResult { ...@@ -30,12 +91,24 @@ class UrlSearchResult : public app_list::SearchResult {
private: private:
// Overriddenn from app_list::SearchResult: // Overriddenn from app_list::SearchResult:
virtual void Open(int event_flags) OVERRIDE { virtual void Open(int event_flags) OVERRIDE {
GURL url;
if (input_.type() == metrics::OmniboxInputType::URL) {
url = input_.canonicalized_url();
} else {
TemplateURL* template_url =
template_url_service_->GetDefaultSearchProvider();
const TemplateURLRef& search_url = template_url->url_ref();
TemplateURLRef::SearchTermsArgs search_terms_args(input_.text());
url = GURL(search_url.ReplaceSearchTerms(
search_terms_args, template_url_service_->search_terms_data()));
}
ActivityManager::Get()->AddActivity( ActivityManager::Get()->AddActivity(
ActivityFactory::Get()->CreateWebActivity(browser_context_, url_)); ActivityFactory::Get()->CreateWebActivity(browser_context_, url));
} }
content::BrowserContext* browser_context_; content::BrowserContext* browser_context_;
const GURL url_; TemplateURLService* template_url_service_;
AutocompleteInput input_;
DISALLOW_COPY_AND_ASSIGN(UrlSearchResult); DISALLOW_COPY_AND_ASSIGN(UrlSearchResult);
}; };
...@@ -43,7 +116,18 @@ class UrlSearchResult : public app_list::SearchResult { ...@@ -43,7 +116,18 @@ class UrlSearchResult : public app_list::SearchResult {
} // namespace } // namespace
UrlSearchProvider::UrlSearchProvider(content::BrowserContext* browser_context) UrlSearchProvider::UrlSearchProvider(content::BrowserContext* browser_context)
: browser_context_(browser_context) { : browser_context_(browser_context),
// TODO(mukai): introduce the real parameters when it's necessary.
template_url_service_(
new TemplateURLService(NULL /* prefs */,
make_scoped_ptr(new SearchTermsData()),
NULL /* KeywordWebDataService */,
scoped_ptr<TemplateURLServiceClient>(
new AthenaTemplateURLServiceClient()),
NULL /*GoogleURLTracker */,
NULL /* RapporService */,
base::Closure() /* dsp_change_callback */)) {
template_url_service_->Load();
} }
UrlSearchProvider::~UrlSearchProvider() { UrlSearchProvider::~UrlSearchProvider() {
...@@ -51,8 +135,8 @@ UrlSearchProvider::~UrlSearchProvider() { ...@@ -51,8 +135,8 @@ UrlSearchProvider::~UrlSearchProvider() {
void UrlSearchProvider::Start(const base::string16& query) { void UrlSearchProvider::Start(const base::string16& query) {
ClearResults(); ClearResults();
Add(scoped_ptr<app_list::SearchResult>( Add(scoped_ptr<app_list::SearchResult>(new UrlSearchResult(
new UrlSearchResult(browser_context_, query))); browser_context_, template_url_service_.get(), query)));
} }
void UrlSearchProvider::Stop() { void UrlSearchProvider::Stop() {
......
...@@ -5,8 +5,11 @@ ...@@ -5,8 +5,11 @@
#ifndef ATHENA_MAIN_URL_SEARCH_PROVIDER_H_ #ifndef ATHENA_MAIN_URL_SEARCH_PROVIDER_H_
#define ATHENA_MAIN_URL_SEARCH_PROVIDER_H_ #define ATHENA_MAIN_URL_SEARCH_PROVIDER_H_
#include "base/memory/scoped_ptr.h"
#include "ui/app_list/search_provider.h" #include "ui/app_list/search_provider.h"
class TemplateURLService;
namespace content { namespace content {
class BrowserContext; class BrowserContext;
} }
...@@ -26,6 +29,9 @@ class UrlSearchProvider : public app_list::SearchProvider { ...@@ -26,6 +29,9 @@ class UrlSearchProvider : public app_list::SearchProvider {
private: private:
content::BrowserContext* browser_context_; content::BrowserContext* browser_context_;
// TODO(mukai): This should be provided through BrowserContextKeyedService.
scoped_ptr<TemplateURLService> template_url_service_;
DISALLOW_COPY_AND_ASSIGN(UrlSearchProvider); DISALLOW_COPY_AND_ASSIGN(UrlSearchProvider);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment