| Index: chrome/browser/autofill/autofill_external_delegate.cc
|
| diff --git a/chrome/browser/autofill/autofill_external_delegate.cc b/chrome/browser/autofill/autofill_external_delegate.cc
|
| index 457f86dfca472febe8da76c86b1dbe61ed198c40..90f71a873a43ec6b91a1d3da32f84c2d89fbfd2f 100644
|
| --- a/chrome/browser/autofill/autofill_external_delegate.cc
|
| +++ b/chrome/browser/autofill/autofill_external_delegate.cc
|
| @@ -2,17 +2,25 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include "base/utf_string_conversions.h"
|
| #include "chrome/browser/autofill/autofill_external_delegate.h"
|
| +#include "chrome/browser/autofill/autofill_manager.h"
|
| #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
| #include "chrome/common/autofill_messages.h"
|
| +#include "chrome/common/chrome_constants.h"
|
| #include "content/browser/renderer_host/render_view_host.h"
|
| +#include "grit/generated_resources.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
|
|
| AutofillExternalDelegate::~AutofillExternalDelegate() {
|
| }
|
|
|
| AutofillExternalDelegate::AutofillExternalDelegate(
|
| TabContentsWrapper* tab_contents_wrapper)
|
| - : tab_contents_wrapper_(tab_contents_wrapper) {
|
| + : tab_contents_wrapper_(tab_contents_wrapper),
|
| + autofill_query_id_(0),
|
| + display_warning_if_disabled_(false),
|
| + has_shown_autofill_popup_for_current_edit_(false) {
|
| }
|
|
|
| void AutofillExternalDelegate::SelectAutofillSuggestionAtIndex(int listIndex) {
|
| @@ -22,6 +30,103 @@ void AutofillExternalDelegate::SelectAutofillSuggestionAtIndex(int listIndex) {
|
| listIndex));
|
| }
|
|
|
| +void AutofillExternalDelegate::OnQuery(int query_id,
|
| + const webkit_glue::FormData& form,
|
| + const webkit_glue::FormField& field,
|
| + const gfx::Rect& bounds,
|
| + bool display_warning_if_disabled) {
|
| + autofill_query_field_ = field;
|
| + display_warning_if_disabled_ = display_warning_if_disabled;
|
| + autofill_query_id_ = query_id;
|
| +
|
| + OnQueryPlatformSpecific(query_id, form, field);
|
| +}
|
| +
|
| +void AutofillExternalDelegate::DidEndTextFieldEditing() {
|
| + has_shown_autofill_popup_for_current_edit_ = false;
|
| +}
|
| +
|
| +void AutofillExternalDelegate::OnSuggestionsReturned(
|
| + int query_id,
|
| + const std::vector<string16>& values,
|
| + const std::vector<string16>& labels,
|
| + const std::vector<string16>& icons,
|
| + const std::vector<int>& unique_ids) {
|
| + if (query_id != autofill_query_id_)
|
| + return;
|
| +
|
| + if (values.empty()) {
|
| + // No suggestions, any popup currently showing is obsolete.
|
| + HideAutofillPopup();
|
| + return;
|
| + }
|
| +
|
| + std::vector<string16> v(values);
|
| + std::vector<string16> l(labels);
|
| + std::vector<string16> i(icons);
|
| + std::vector<int> ids(unique_ids);
|
| + int separator_index = -1;
|
| +
|
| + DCHECK_GT(ids.size(), 0U);
|
| + if (!autofill_query_field_.should_autocomplete) {
|
| + // If autofill is disabled and we had suggestions, show a warning instead.
|
| + v.assign(1, l10n_util::GetStringUTF16(IDS_AUTOFILL_WARNING_FORM_DISABLED));
|
| + l.assign(1, string16());
|
| + i.assign(1, string16());
|
| + ids.assign(1, -1);
|
| + } else if (ids[0] < 0 && ids.size() > 1) {
|
| + // If we received a warning instead of suggestions from autofill but regular
|
| + // suggestions from autocomplete, don't show the autofill warning.
|
| + v.erase(v.begin());
|
| + l.erase(l.begin());
|
| + i.erase(i.begin());
|
| + ids.erase(ids.begin());
|
| + }
|
| +
|
| + // If we were about to show a warning and we shouldn't, don't.
|
| + if (ids[0] < 0 && !display_warning_if_disabled_)
|
| + return;
|
| +
|
| + // Only include "Autofill Options" special menu item if we have Autofill
|
| + // items, identified by |unique_ids| having at least one valid value.
|
| + bool has_autofill_item = false;
|
| + for (size_t i = 0; i < ids.size(); ++i) {
|
| + if (ids[i] > 0) {
|
| + has_autofill_item = true;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + // The form has been auto-filled, so give the user the chance to clear the
|
| + // form. Append the 'Clear form' menu item.
|
| + if (has_autofill_item &&
|
| + autofill_query_field_.is_autofilled) {
|
| + v.push_back(l10n_util::GetStringUTF16(IDS_AUTOFILL_CLEAR_FORM_MENU_ITEM));
|
| + l.push_back(string16());
|
| + i.push_back(string16());
|
| + ids.push_back(0);
|
| + separator_index = v.size() - 1;
|
| + }
|
| +
|
| + if (has_autofill_item) {
|
| + // Append the 'Chrome Autofill options' menu item;
|
| + v.push_back(l10n_util::GetStringFUTF16(IDS_AUTOFILL_OPTIONS_POPUP,
|
| + WideToUTF16(chrome::kBrowserAppName)));
|
| + l.push_back(string16());
|
| + i.push_back(string16());
|
| + ids.push_back(0);
|
| + separator_index = values.size();
|
| + }
|
| +
|
| + // Send to display.
|
| + if (!v.empty() && autofill_query_field_.is_focusable)
|
| + ApplyAutofillSuggestions(v, l, i, ids, separator_index);
|
| +
|
| + tab_contents_wrapper_->autofill_manager()->OnDidShowAutofillSuggestions(
|
| + has_autofill_item && !has_shown_autofill_popup_for_current_edit_);
|
| + has_shown_autofill_popup_for_current_edit_ |= has_autofill_item;
|
| +}
|
| +
|
|
|
| // Add a "!defined(OS_YOUROS) for each platform that implements this
|
| // in an autofill_external_delegate_YOUROS.cc. Currently there are
|
|
|