Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(691)

Side by Side Diff: chrome/browser/ui/webui/omnibox/omnibox_ui_handler.cc

Issue 294833002: Mojo: more idiomatic C++ bindings (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | content/browser/renderer_host/render_process_host_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/omnibox/omnibox_ui_handler.h" 5 #include "chrome/browser/ui/webui/omnibox/omnibox_ui_handler.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/strings/string16.h" 11 #include "base/strings/string16.h"
12 #include "base/strings/stringprintf.h" 12 #include "base/strings/stringprintf.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "base/time/time.h" 14 #include "base/time/time.h"
15 #include "base/values.h" 15 #include "base/values.h"
16 #include "chrome/browser/autocomplete/autocomplete_classifier.h" 16 #include "chrome/browser/autocomplete/autocomplete_classifier.h"
17 #include "chrome/browser/autocomplete/autocomplete_controller.h" 17 #include "chrome/browser/autocomplete/autocomplete_controller.h"
18 #include "chrome/browser/autocomplete/autocomplete_match.h" 18 #include "chrome/browser/autocomplete/autocomplete_match.h"
19 #include "chrome/browser/autocomplete/autocomplete_provider.h" 19 #include "chrome/browser/autocomplete/autocomplete_provider.h"
20 #include "chrome/browser/history/history_service.h" 20 #include "chrome/browser/history/history_service.h"
21 #include "chrome/browser/history/history_service_factory.h" 21 #include "chrome/browser/history/history_service_factory.h"
22 #include "chrome/browser/history/url_database.h" 22 #include "chrome/browser/history/url_database.h"
23 #include "chrome/browser/search/search.h" 23 #include "chrome/browser/search/search.h"
24 #include "chrome/browser/search_engines/template_url.h" 24 #include "chrome/browser/search_engines/template_url.h"
25 #include "content/public/browser/web_ui.h" 25 #include "content/public/browser/web_ui.h"
26 #include "mojo/common/common_type_converters.h" 26 #include "mojo/common/common_type_converters.h"
27 #include "mojo/public/cpp/bindings/allocation_scope.h"
28 27
29 namespace mojo { 28 namespace mojo {
30 29
31 template <> 30 template <>
32 class TypeConverter<mojo::Array<AutocompleteAdditionalInfo>, 31 class TypeConverter<mojo::Array<AutocompleteAdditionalInfoPtr>,
33 AutocompleteMatch::AdditionalInfo> { 32 AutocompleteMatch::AdditionalInfo> {
34 public: 33 public:
35 static mojo::Array<AutocompleteAdditionalInfo> ConvertFrom( 34 static mojo::Array<AutocompleteAdditionalInfoPtr> ConvertFrom(
36 const AutocompleteMatch::AdditionalInfo& input, 35 const AutocompleteMatch::AdditionalInfo& input) {
37 Buffer* buf) { 36 mojo::Array<AutocompleteAdditionalInfoPtr> array(input.size());
38 mojo::Array<AutocompleteAdditionalInfo>::Builder array_builder(
39 input.size(), buf);
40 size_t index = 0; 37 size_t index = 0;
41 for (AutocompleteMatch::AdditionalInfo::const_iterator i = input.begin(); 38 for (AutocompleteMatch::AdditionalInfo::const_iterator i = input.begin();
42 i != input.end(); ++i, index++) { 39 i != input.end(); ++i, index++) {
43 AutocompleteAdditionalInfo::Builder item_builder(buf); 40 AutocompleteAdditionalInfoPtr item(AutocompleteAdditionalInfo::New());
44 item_builder.set_key(i->first); 41 item->key = i->first;
45 item_builder.set_value(i->second); 42 item->value = i->second;
46 array_builder[index] = item_builder.Finish(); 43 array[index] = item.Pass();
47 } 44 }
48 return array_builder.Finish(); 45 return array.Pass();
49 } 46 }
50
51 MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION();
52 }; 47 };
53 48
54 template <> 49 template <>
55 class TypeConverter<AutocompleteMatchMojo, AutocompleteMatch> { 50 class TypeConverter<AutocompleteMatchMojoPtr, AutocompleteMatch> {
56 public: 51 public:
57 static AutocompleteMatchMojo ConvertFrom(const AutocompleteMatch& input, 52 static AutocompleteMatchMojoPtr ConvertFrom(const AutocompleteMatch& input) {
58 Buffer* buf) { 53 AutocompleteMatchMojoPtr result(AutocompleteMatchMojo::New());
59 AutocompleteMatchMojo::Builder builder(buf);
60 if (input.provider != NULL) { 54 if (input.provider != NULL) {
61 builder.set_provider_name(input.provider->GetName()); 55 result->provider_name = input.provider->GetName();
62 builder.set_provider_done(input.provider->done()); 56 result->provider_done = input.provider->done();
63 } 57 }
64 builder.set_relevance(input.relevance); 58 result->relevance = input.relevance;
65 builder.set_deletable(input.deletable); 59 result->deletable = input.deletable;
66 builder.set_fill_into_edit(input.fill_into_edit); 60 result->fill_into_edit = mojo::String::From(input.fill_into_edit);
67 builder.set_inline_autocompletion(input.inline_autocompletion); 61 result->inline_autocompletion =
68 builder.set_destination_url(input.destination_url.spec()); 62 mojo::String::From(input.inline_autocompletion);
69 builder.set_contents(input.contents); 63 result->destination_url = input.destination_url.spec();
64 result->contents = mojo::String::From(input.contents);
70 // At this time, we're not bothering to send along the long vector that 65 // At this time, we're not bothering to send along the long vector that
71 // represent contents classification. i.e., for each character, what 66 // represent contents classification. i.e., for each character, what
72 // type of text it is. 67 // type of text it is.
73 builder.set_description(input.description); 68 result->description = mojo::String::From(input.description);
74 // At this time, we're not bothering to send along the long vector that 69 // At this time, we're not bothering to send along the long vector that
75 // represents description classification. i.e., for each character, what 70 // represents description classification. i.e., for each character, what
76 // type of text it is. 71 // type of text it is.
77 builder.set_transition(input.transition); 72 result->transition = input.transition;
78 builder.set_is_history_what_you_typed_match( 73 result->is_history_what_you_typed_match =
79 input.is_history_what_you_typed_match); 74 input.is_history_what_you_typed_match;
80 builder.set_allowed_to_be_default_match(input.allowed_to_be_default_match); 75 result->allowed_to_be_default_match = input.allowed_to_be_default_match;
81 builder.set_type(AutocompleteMatchType::ToString(input.type)); 76 result->type = AutocompleteMatchType::ToString(input.type);
82 if (input.associated_keyword.get() != NULL) 77 if (input.associated_keyword.get() != NULL) {
83 builder.set_associated_keyword(input.associated_keyword->keyword); 78 result->associated_keyword =
84 builder.set_keyword(input.keyword); 79 mojo::String::From(input.associated_keyword->keyword);
85 builder.set_starred(input.starred); 80 }
86 builder.set_duplicates(static_cast<int32>(input.duplicate_matches.size())); 81 result->keyword = mojo::String::From(input.keyword);
87 builder.set_from_previous(input.from_previous); 82 result->starred = input.starred;
83 result->duplicates = static_cast<int32>(input.duplicate_matches.size());
84 result->from_previous = input.from_previous;
88 85
89 builder.set_additional_info(input.additional_info); 86 result->additional_info =
90 return builder.Finish(); 87 mojo::Array<AutocompleteAdditionalInfoPtr>::From(input.additional_info);
88 return result.Pass();
91 } 89 }
92
93 MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION();
94 }; 90 };
95 91
96 template <> 92 template <>
97 class TypeConverter<AutocompleteResultsForProviderMojo, AutocompleteProvider*> { 93 class TypeConverter<AutocompleteResultsForProviderMojoPtr,
94 AutocompleteProvider*> {
98 public: 95 public:
99 static AutocompleteResultsForProviderMojo ConvertFrom( 96 static AutocompleteResultsForProviderMojoPtr ConvertFrom(
100 const AutocompleteProvider* input, 97 const AutocompleteProvider* input) {
101 Buffer* buf) { 98 AutocompleteResultsForProviderMojoPtr result(
102 AutocompleteResultsForProviderMojo::Builder builder(buf); 99 AutocompleteResultsForProviderMojo::New());
103 builder.set_provider_name(input->GetName()); 100 result->provider_name = input->GetName();
104 builder.set_results( 101 result->results =
105 mojo::Array<AutocompleteMatchMojo>::From(input->matches())); 102 mojo::Array<AutocompleteMatchMojoPtr>::From(input->matches());
106 return builder.Finish(); 103 return result.Pass();
107 } 104 }
108
109 MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION();
110 }; 105 };
111 106
112 } // namespace mojo 107 } // namespace mojo
113 108
114 OmniboxUIHandler::OmniboxUIHandler(Profile* profile) 109 OmniboxUIHandler::OmniboxUIHandler(Profile* profile)
115 : profile_(profile) { 110 : profile_(profile) {
116 ResetController(); 111 ResetController();
117 } 112 }
118 113
119 OmniboxUIHandler::~OmniboxUIHandler() {} 114 OmniboxUIHandler::~OmniboxUIHandler() {}
120 115
121 void OmniboxUIHandler::OnResultChanged(bool default_match_changed) { 116 void OmniboxUIHandler::OnResultChanged(bool default_match_changed) {
122 mojo::AllocationScope scope; 117 OmniboxResultMojoPtr result(OmniboxResultMojo::New());
123 OmniboxResultMojo::Builder builder; 118 result->done = controller_->done();
124 builder.set_done(controller_->done()); 119 result->time_since_omnibox_started_ms =
125 builder.set_time_since_omnibox_started_ms( 120 (base::Time::Now() - time_omnibox_started_).InMilliseconds();
126 (base::Time::Now() - time_omnibox_started_).InMilliseconds());
127 const base::string16 host = input_.text().substr( 121 const base::string16 host = input_.text().substr(
128 input_.parts().host.begin, 122 input_.parts().host.begin,
129 input_.parts().host.len); 123 input_.parts().host.len);
130 builder.set_host(host); 124 result->host = mojo::String::From(host);
131 bool is_typed_host; 125 bool is_typed_host;
132 if (!LookupIsTypedHost(host, &is_typed_host)) 126 if (!LookupIsTypedHost(host, &is_typed_host))
133 is_typed_host = false; 127 is_typed_host = false;
134 builder.set_is_typed_host(is_typed_host); 128 result->is_typed_host = is_typed_host;
135 129
136 { 130 {
137 // Copy to an ACMatches to make conversion easier. Since this isn't 131 // Copy to an ACMatches to make conversion easier. Since this isn't
138 // performance critical we don't worry about the cost here. 132 // performance critical we don't worry about the cost here.
139 ACMatches matches(controller_->result().begin(), 133 ACMatches matches(controller_->result().begin(),
140 controller_->result().end()); 134 controller_->result().end());
141 builder.set_combined_results( 135 result->combined_results =
142 mojo::Array<AutocompleteMatchMojo>::From(matches)); 136 mojo::Array<AutocompleteMatchMojoPtr>::From(matches);
143 } 137 }
144 builder.set_results_by_provider( 138 result->results_by_provider =
145 mojo::Array<AutocompleteResultsForProviderMojo>::From( 139 mojo::Array<AutocompleteResultsForProviderMojoPtr>::From(
146 *controller_->providers())); 140 *controller_->providers());
147 client()->HandleNewAutocompleteResult(builder.Finish()); 141 client()->HandleNewAutocompleteResult(result.Pass());
148 } 142 }
149 143
150 bool OmniboxUIHandler::LookupIsTypedHost(const base::string16& host, 144 bool OmniboxUIHandler::LookupIsTypedHost(const base::string16& host,
151 bool* is_typed_host) const { 145 bool* is_typed_host) const {
152 HistoryService* const history_service = 146 HistoryService* const history_service =
153 HistoryServiceFactory::GetForProfile(profile_, 147 HistoryServiceFactory::GetForProfile(profile_,
154 Profile::EXPLICIT_ACCESS); 148 Profile::EXPLICIT_ACCESS);
155 if (!history_service) 149 if (!history_service)
156 return false; 150 return false;
157 history::URLDatabase* url_db = history_service->InMemoryDatabase(); 151 history::URLDatabase* url_db = history_service->InMemoryDatabase();
158 if (!url_db) 152 if (!url_db)
159 return false; 153 return false;
160 *is_typed_host = url_db->IsTypedHost(base::UTF16ToUTF8(host)); 154 *is_typed_host = url_db->IsTypedHost(base::UTF16ToUTF8(host));
161 return true; 155 return true;
162 } 156 }
163 157
164 void OmniboxUIHandler::StartOmniboxQuery(const mojo::String& input_string, 158 void OmniboxUIHandler::StartOmniboxQuery(const mojo::String& input_string,
165 int32_t cursor_position, 159 int32_t cursor_position,
166 bool prevent_inline_autocomplete, 160 bool prevent_inline_autocomplete,
167 bool prefer_keyword, 161 bool prefer_keyword,
168 int32_t page_classification) { 162 int32_t page_classification) {
169 // Reset the controller. If we don't do this, then the 163 // Reset the controller. If we don't do this, then the
170 // AutocompleteController might inappropriately set its |minimal_changes| 164 // AutocompleteController might inappropriately set its |minimal_changes|
171 // variable (or something else) and some providers will short-circuit 165 // variable (or something else) and some providers will short-circuit
172 // important logic and return stale results. In short, we want the 166 // important logic and return stale results. In short, we want the
173 // actual results to not depend on the state of the previous request. 167 // actual results to not depend on the state of the previous request.
174 ResetController(); 168 ResetController();
175 time_omnibox_started_ = base::Time::Now(); 169 time_omnibox_started_ = base::Time::Now();
176 input_ = AutocompleteInput( 170 input_ = AutocompleteInput(
177 input_string, 171 input_string.To<base::string16>(),
178 cursor_position, 172 cursor_position,
179 base::string16(), // user's desired tld (top-level domain) 173 base::string16(), // user's desired tld (top-level domain)
180 GURL(), 174 GURL(),
181 static_cast<AutocompleteInput::PageClassification>( 175 static_cast<AutocompleteInput::PageClassification>(
182 page_classification), 176 page_classification),
183 prevent_inline_autocomplete, 177 prevent_inline_autocomplete,
184 prefer_keyword, 178 prefer_keyword,
185 true, // allow exact keyword matches 179 true, // allow exact keyword matches
186 true); 180 true);
187 controller_->Start(input_); // want all matches 181 controller_->Start(input_); // want all matches
188 } 182 }
189 183
190 void OmniboxUIHandler::ResetController() { 184 void OmniboxUIHandler::ResetController() {
191 controller_.reset(new AutocompleteController(profile_, this, 185 controller_.reset(new AutocompleteController(profile_, this,
192 AutocompleteClassifier::kDefaultOmniboxProviders)); 186 AutocompleteClassifier::kDefaultOmniboxProviders));
193 } 187 }
OLDNEW
« no previous file with comments | « no previous file | content/browser/renderer_host/render_process_host_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698