Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/autofill/autofill_popup_controller_impl.h" | 5 #include "chrome/browser/ui/autofill/autofill_popup_controller_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
| 12 #include "chrome/browser/ui/autofill/autofill_popup_view.h" | 12 #include "chrome/browser/ui/autofill/autofill_popup_view.h" |
| 13 #include "chrome/browser/ui/autofill/popup_constants.h" | 13 #include "chrome/browser/ui/autofill/popup_constants.h" |
| 14 #include "components/autofill/core/browser/autofill_popup_delegate.h" | 14 #include "components/autofill/core/browser/autofill_popup_delegate.h" |
| 15 #include "components/autofill/core/common/autofill_enums.h" | |
| 15 #include "content/public/browser/native_web_keyboard_event.h" | 16 #include "content/public/browser/native_web_keyboard_event.h" |
| 16 #include "grit/webkit_resources.h" | 17 #include "grit/webkit_resources.h" |
| 17 #include "third_party/WebKit/public/web/WebAutofillClient.h" | |
| 18 #include "ui/base/resource/resource_bundle.h" | 18 #include "ui/base/resource/resource_bundle.h" |
| 19 #include "ui/events/event.h" | 19 #include "ui/events/event.h" |
| 20 #include "ui/gfx/rect_conversions.h" | 20 #include "ui/gfx/rect_conversions.h" |
| 21 #include "ui/gfx/screen.h" | 21 #include "ui/gfx/screen.h" |
| 22 #include "ui/gfx/text_elider.h" | 22 #include "ui/gfx/text_elider.h" |
| 23 #include "ui/gfx/text_utils.h" | 23 #include "ui/gfx/text_utils.h" |
| 24 #include "ui/gfx/vector2d.h" | 24 #include "ui/gfx/vector2d.h" |
| 25 | 25 |
| 26 using base::WeakPtr; | 26 using base::WeakPtr; |
| 27 using blink::WebAutofillClient; | |
| 28 | 27 |
| 29 namespace autofill { | 28 namespace autofill { |
| 30 namespace { | 29 namespace { |
| 31 | 30 |
| 32 // Used to indicate that no line is currently selected by the user. | 31 // Used to indicate that no line is currently selected by the user. |
| 33 const int kNoSelection = -1; | 32 const int kNoSelection = -1; |
| 34 | 33 |
| 35 // The vertical height of each row in pixels. | 34 // The vertical height of each row in pixels. |
| 36 const size_t kRowHeight = 24; | 35 const size_t kRowHeight = 24; |
| 37 | 36 |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 delegate_->OnPopupShown(); | 181 delegate_->OnPopupShown(); |
| 183 controller_common_->RegisterKeyPressCallback(); | 182 controller_common_->RegisterKeyPressCallback(); |
| 184 } | 183 } |
| 185 | 184 |
| 186 void AutofillPopupControllerImpl::UpdateDataListValues( | 185 void AutofillPopupControllerImpl::UpdateDataListValues( |
| 187 const std::vector<base::string16>& values, | 186 const std::vector<base::string16>& values, |
| 188 const std::vector<base::string16>& labels) { | 187 const std::vector<base::string16>& labels) { |
| 189 // Remove all the old data list values, which should always be at the top of | 188 // Remove all the old data list values, which should always be at the top of |
| 190 // the list if they are present. | 189 // the list if they are present. |
| 191 while (!identifiers_.empty() && | 190 while (!identifiers_.empty() && |
| 192 identifiers_[0] == WebAutofillClient::MenuItemIDDataListEntry) { | 191 identifiers_[0] == POPUP_ITEM_ID_DATALIST_ENTRY) { |
| 193 names_.erase(names_.begin()); | 192 names_.erase(names_.begin()); |
| 194 subtexts_.erase(subtexts_.begin()); | 193 subtexts_.erase(subtexts_.begin()); |
| 195 icons_.erase(icons_.begin()); | 194 icons_.erase(icons_.begin()); |
| 196 identifiers_.erase(identifiers_.begin()); | 195 identifiers_.erase(identifiers_.begin()); |
| 197 } | 196 } |
| 198 | 197 |
| 199 // If there are no new data list values, exit (clearing the separator if there | 198 // If there are no new data list values, exit (clearing the separator if there |
| 200 // is one). | 199 // is one). |
| 201 if (values.empty()) { | 200 if (values.empty()) { |
| 202 if (!identifiers_.empty() && | 201 if (!identifiers_.empty() && identifiers_[0] == POPUP_ITEM_ID_SEPERATOR) { |
|
blundell
2014/02/13 16:10:58
nit: SEPARATOR
gnana
2014/02/14 09:02:06
Applied everywhere.
Done.
| |
| 203 identifiers_[0] == WebAutofillClient::MenuItemIDSeparator) { | |
| 204 names_.erase(names_.begin()); | 202 names_.erase(names_.begin()); |
| 205 subtexts_.erase(subtexts_.begin()); | 203 subtexts_.erase(subtexts_.begin()); |
| 206 icons_.erase(icons_.begin()); | 204 icons_.erase(icons_.begin()); |
| 207 identifiers_.erase(identifiers_.begin()); | 205 identifiers_.erase(identifiers_.begin()); |
| 208 } | 206 } |
| 209 | 207 |
| 210 // The popup contents have changed, so either update the bounds or hide it. | 208 // The popup contents have changed, so either update the bounds or hide it. |
| 211 if (HasSuggestions()) | 209 if (HasSuggestions()) |
| 212 UpdateBoundsAndRedrawPopup(); | 210 UpdateBoundsAndRedrawPopup(); |
| 213 else | 211 else |
| 214 Hide(); | 212 Hide(); |
| 215 | 213 |
| 216 return; | 214 return; |
| 217 } | 215 } |
| 218 | 216 |
| 219 // Add a separator if there are any other values. | 217 // Add a separator if there are any other values. |
| 220 if (!identifiers_.empty() && | 218 if (!identifiers_.empty() && identifiers_[0] != POPUP_ITEM_ID_SEPERATOR) { |
| 221 identifiers_[0] != WebAutofillClient::MenuItemIDSeparator) { | |
| 222 names_.insert(names_.begin(), base::string16()); | 219 names_.insert(names_.begin(), base::string16()); |
| 223 subtexts_.insert(subtexts_.begin(), base::string16()); | 220 subtexts_.insert(subtexts_.begin(), base::string16()); |
| 224 icons_.insert(icons_.begin(), base::string16()); | 221 icons_.insert(icons_.begin(), base::string16()); |
| 225 identifiers_.insert(identifiers_.begin(), | 222 identifiers_.insert(identifiers_.begin(), POPUP_ITEM_ID_SEPERATOR); |
| 226 WebAutofillClient::MenuItemIDSeparator); | |
| 227 } | 223 } |
| 228 | 224 |
| 229 | 225 |
| 230 names_.insert(names_.begin(), values.begin(), values.end()); | 226 names_.insert(names_.begin(), values.begin(), values.end()); |
| 231 subtexts_.insert(subtexts_.begin(), labels.begin(), labels.end()); | 227 subtexts_.insert(subtexts_.begin(), labels.begin(), labels.end()); |
| 232 | 228 |
| 233 // Add the values that are the same for all data list elements. | 229 // Add the values that are the same for all data list elements. |
| 234 icons_.insert(icons_.begin(), values.size(), base::string16()); | 230 icons_.insert(icons_.begin(), values.size(), base::string16()); |
| 235 identifiers_.insert(identifiers_.begin(), | 231 identifiers_.insert( |
| 236 values.size(), | 232 identifiers_.begin(), values.size(), POPUP_ITEM_ID_DATALIST_ENTRY); |
| 237 WebAutofillClient::MenuItemIDDataListEntry); | |
| 238 | 233 |
| 239 UpdateBoundsAndRedrawPopup(); | 234 UpdateBoundsAndRedrawPopup(); |
| 240 } | 235 } |
| 241 | 236 |
| 242 void AutofillPopupControllerImpl::Hide() { | 237 void AutofillPopupControllerImpl::Hide() { |
| 243 controller_common_->RemoveKeyPressCallback(); | 238 controller_common_->RemoveKeyPressCallback(); |
| 244 if (delegate_.get()) | 239 if (delegate_.get()) |
| 245 delegate_->OnPopupHidden(); | 240 delegate_->OnPopupHidden(); |
| 246 | 241 |
| 247 if (view_) | 242 if (view_) |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 return kDataResources[i].id; | 332 return kDataResources[i].id; |
| 338 } | 333 } |
| 339 | 334 |
| 340 return -1; | 335 return -1; |
| 341 } | 336 } |
| 342 | 337 |
| 343 bool AutofillPopupControllerImpl::CanDelete(size_t index) const { | 338 bool AutofillPopupControllerImpl::CanDelete(size_t index) const { |
| 344 // TODO(isherman): Native AddressBook suggestions on Mac and Android should | 339 // TODO(isherman): Native AddressBook suggestions on Mac and Android should |
| 345 // not be considered to be deleteable. | 340 // not be considered to be deleteable. |
| 346 int id = identifiers_[index]; | 341 int id = identifiers_[index]; |
| 347 return id > 0 || | 342 return id > 0 || id == POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY || |
| 348 id == WebAutofillClient::MenuItemIDAutocompleteEntry || | 343 id == POPUP_ITEM_ID_PASSWORD_ENTRY; |
| 349 id == WebAutofillClient::MenuItemIDPasswordEntry; | |
| 350 } | 344 } |
| 351 | 345 |
| 352 bool AutofillPopupControllerImpl::IsWarning(size_t index) const { | 346 bool AutofillPopupControllerImpl::IsWarning(size_t index) const { |
| 353 return identifiers_[index] == WebAutofillClient::MenuItemIDWarningMessage; | 347 return identifiers_[index] == POPUP_ITEM_ID_WARNING_MESSAGE; |
| 354 } | 348 } |
| 355 | 349 |
| 356 gfx::Rect AutofillPopupControllerImpl::GetRowBounds(size_t index) { | 350 gfx::Rect AutofillPopupControllerImpl::GetRowBounds(size_t index) { |
| 357 int top = kPopupBorderThickness; | 351 int top = kPopupBorderThickness; |
| 358 for (size_t i = 0; i < index; ++i) { | 352 for (size_t i = 0; i < index; ++i) { |
| 359 top += GetRowHeightFromId(identifiers()[i]); | 353 top += GetRowHeightFromId(identifiers()[i]); |
| 360 } | 354 } |
| 361 | 355 |
| 362 return gfx::Rect( | 356 return gfx::Rect( |
| 363 kPopupBorderThickness, | 357 kPopupBorderThickness, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 404 return icons_; | 398 return icons_; |
| 405 } | 399 } |
| 406 | 400 |
| 407 const std::vector<int>& AutofillPopupControllerImpl::identifiers() const { | 401 const std::vector<int>& AutofillPopupControllerImpl::identifiers() const { |
| 408 return identifiers_; | 402 return identifiers_; |
| 409 } | 403 } |
| 410 | 404 |
| 411 #if !defined(OS_ANDROID) | 405 #if !defined(OS_ANDROID) |
| 412 const gfx::FontList& AutofillPopupControllerImpl::GetNameFontListForRow( | 406 const gfx::FontList& AutofillPopupControllerImpl::GetNameFontListForRow( |
| 413 size_t index) const { | 407 size_t index) const { |
| 414 if (identifiers_[index] == WebAutofillClient::MenuItemIDWarningMessage) | 408 if (identifiers_[index] == POPUP_ITEM_ID_WARNING_MESSAGE) |
| 415 return warning_font_list_; | 409 return warning_font_list_; |
| 416 | 410 |
| 417 return name_font_list_; | 411 return name_font_list_; |
| 418 } | 412 } |
| 419 | 413 |
| 420 const gfx::FontList& AutofillPopupControllerImpl::subtext_font_list() const { | 414 const gfx::FontList& AutofillPopupControllerImpl::subtext_font_list() const { |
| 421 return subtext_font_list_; | 415 return subtext_font_list_; |
| 422 } | 416 } |
| 423 #endif | 417 #endif |
| 424 | 418 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 534 | 528 |
| 535 if (y <= current_height) | 529 if (y <= current_height) |
| 536 return i; | 530 return i; |
| 537 } | 531 } |
| 538 | 532 |
| 539 // The y value goes beyond the popup so stop the selection at the last line. | 533 // The y value goes beyond the popup so stop the selection at the last line. |
| 540 return identifiers().size() - 1; | 534 return identifiers().size() - 1; |
| 541 } | 535 } |
| 542 | 536 |
| 543 int AutofillPopupControllerImpl::GetRowHeightFromId(int identifier) const { | 537 int AutofillPopupControllerImpl::GetRowHeightFromId(int identifier) const { |
| 544 if (identifier == WebAutofillClient::MenuItemIDSeparator) | 538 if (identifier == POPUP_ITEM_ID_SEPERATOR) |
| 545 return kSeparatorHeight; | 539 return kSeparatorHeight; |
| 546 | 540 |
| 547 return kRowHeight; | 541 return kRowHeight; |
| 548 } | 542 } |
| 549 | 543 |
| 550 bool AutofillPopupControllerImpl::CanAccept(int id) { | 544 bool AutofillPopupControllerImpl::CanAccept(int id) { |
| 551 return id != WebAutofillClient::MenuItemIDSeparator && | 545 return id != POPUP_ITEM_ID_SEPERATOR && id != POPUP_ITEM_ID_WARNING_MESSAGE; |
| 552 id != WebAutofillClient::MenuItemIDWarningMessage; | |
| 553 } | 546 } |
| 554 | 547 |
| 555 bool AutofillPopupControllerImpl::HasSuggestions() { | 548 bool AutofillPopupControllerImpl::HasSuggestions() { |
| 556 return identifiers_.size() != 0 && | 549 return identifiers_.size() != 0 && |
| 557 (identifiers_[0] > 0 || | 550 (identifiers_[0] > 0 || |
| 558 identifiers_[0] == | 551 identifiers_[0] == POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY || |
| 559 WebAutofillClient::MenuItemIDAutocompleteEntry || | 552 identifiers_[0] == POPUP_ITEM_ID_PASSWORD_ENTRY || |
| 560 identifiers_[0] == WebAutofillClient::MenuItemIDPasswordEntry || | 553 identifiers_[0] == POPUP_ITEM_ID_DATALIST_ENTRY); |
| 561 identifiers_[0] == WebAutofillClient::MenuItemIDDataListEntry); | |
| 562 } | 554 } |
| 563 | 555 |
| 564 void AutofillPopupControllerImpl::SetValues( | 556 void AutofillPopupControllerImpl::SetValues( |
| 565 const std::vector<base::string16>& names, | 557 const std::vector<base::string16>& names, |
| 566 const std::vector<base::string16>& subtexts, | 558 const std::vector<base::string16>& subtexts, |
| 567 const std::vector<base::string16>& icons, | 559 const std::vector<base::string16>& icons, |
| 568 const std::vector<int>& identifiers) { | 560 const std::vector<int>& identifiers) { |
| 569 names_ = names; | 561 names_ = names; |
| 570 full_names_ = names; | 562 full_names_ = names; |
| 571 subtexts_ = subtexts; | 563 subtexts_ = subtexts; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 653 names_.clear(); | 645 names_.clear(); |
| 654 subtexts_.clear(); | 646 subtexts_.clear(); |
| 655 icons_.clear(); | 647 icons_.clear(); |
| 656 identifiers_.clear(); | 648 identifiers_.clear(); |
| 657 full_names_.clear(); | 649 full_names_.clear(); |
| 658 | 650 |
| 659 selected_line_ = kNoSelection; | 651 selected_line_ = kNoSelection; |
| 660 } | 652 } |
| 661 | 653 |
| 662 } // namespace autofill | 654 } // namespace autofill |
| OLD | NEW |