15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/autofill/password_generation_popup_controller_impl.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <math.h>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_split.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversion_utils.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/autofill/password_generation_popup_observer.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/autofill/password_generation_popup_view.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/autofill/popup_constants.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
171675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch#include "chrome/browser/ui/chrome_pages.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/url_constants.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/google_chrome_strings.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/content/common/autofill_messages.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/core/browser/password_generator.h"
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/password_manager/core/browser/password_manager.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/web_contents.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/rect_conversions.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/text_utils.h"
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace autofill {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::WeakPtr<PasswordGenerationPopupControllerImpl>
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PasswordGenerationPopupControllerImpl::GetOrCreate(
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::WeakPtr<PasswordGenerationPopupControllerImpl> previous,
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::RectF& bounds,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const PasswordForm& form,
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int max_length,
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    password_manager::PasswordManager* password_manager,
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PasswordGenerationPopupObserver* observer,
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::WebContents* web_contents,
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gfx::NativeView container_view) {
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (previous.get() &&
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      previous->element_bounds() == bounds &&
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      previous->web_contents() == web_contents &&
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      previous->container_view() == container_view) {
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return previous;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (previous.get())
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    previous->Hide();
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PasswordGenerationPopupControllerImpl* controller =
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new PasswordGenerationPopupControllerImpl(
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          bounds,
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          form,
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          max_length,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          password_manager,
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          observer,
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          web_contents,
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          container_view);
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return controller->GetWeakPtr();
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PasswordGenerationPopupControllerImpl::PasswordGenerationPopupControllerImpl(
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::RectF& bounds,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const PasswordForm& form,
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int max_length,
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    password_manager::PasswordManager* password_manager,
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PasswordGenerationPopupObserver* observer,
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::WebContents* web_contents,
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gfx::NativeView container_view)
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : view_(NULL),
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      form_(form),
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      password_manager_(password_manager),
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      observer_(observer),
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      generator_(new PasswordGenerator(max_length)),
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      controller_common_(bounds, container_view, web_contents),
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      password_selected_(false),
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_password_(false),
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      weak_ptr_factory_(this) {
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller_common_.SetKeyPressCallback(
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&PasswordGenerationPopupControllerImpl::HandleKeyPressEvent,
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(this)));
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<base::string16> pieces;
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::SplitStringDontTrim(
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_PASSWORD_GENERATION_PROMPT),
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      '|',  // separator
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      &pieces);
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_EQ(3u, pieces.size());
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  link_range_ = gfx::Range(pieces[0].size(),
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           pieces[0].size() + pieces[1].size());
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  help_text_ = JoinString(pieces, base::string16());
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PasswordGenerationPopupControllerImpl::~PasswordGenerationPopupControllerImpl()
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {}
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::WeakPtr<PasswordGenerationPopupControllerImpl>
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PasswordGenerationPopupControllerImpl::GetWeakPtr() {
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return weak_ptr_factory_.GetWeakPtr();
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool PasswordGenerationPopupControllerImpl::HandleKeyPressEvent(
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const content::NativeWebKeyboardEvent& event) {
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switch (event.windowsKeyCode) {
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::VKEY_UP:
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::VKEY_DOWN:
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      PasswordSelected(true);
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return true;
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::VKEY_ESCAPE:
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Hide();
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return true;
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::VKEY_RETURN:
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::VKEY_TAB:
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // We suppress tab if the password is selected because we will
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // automatically advance focus anyway.
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return PossiblyAcceptPassword();
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    default:
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool PasswordGenerationPopupControllerImpl::PossiblyAcceptPassword() {
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (password_selected_) {
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PasswordAccepted();  // This will delete |this|.
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordGenerationPopupControllerImpl::PasswordSelected(bool selected) {
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!display_password_ || selected == password_selected_)
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  password_selected_ = selected;
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_->PasswordSelectionUpdated();
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_->UpdateBoundsAndRedrawPopup();
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordGenerationPopupControllerImpl::PasswordAccepted() {
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!display_password_)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_contents()->GetRenderViewHost()->Send(
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new AutofillMsg_GeneratedPasswordAccepted(
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          web_contents()->GetRenderViewHost()->GetRoutingID(),
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          current_password_));
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  password_manager_->SetFormHasGeneratedPassword(form_);
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Hide();
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint PasswordGenerationPopupControllerImpl::GetMinimumWidth() {
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Minimum width in pixels.
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const int minimum_width = 350;
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If the width of the field is longer than the minimum, use that instead.
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return std::max(minimum_width,
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  controller_common_.RoundedElementBounds().width());
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordGenerationPopupControllerImpl::CalculateBounds() {
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Size bounds = view_->GetPreferredSizeOfPasswordView();
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  popup_bounds_ = controller_common_.GetPopupBounds(bounds.width(),
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                    bounds.height());
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordGenerationPopupControllerImpl::Show(bool display_password) {
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display_password_ = display_password;
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (display_password_ && current_password_.empty())
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    current_password_ = base::ASCIIToUTF16(generator_->Generate());
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!view_) {
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_ = PasswordGenerationPopupView::Create(this);
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CalculateBounds();
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_->Show();
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CalculateBounds();
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_->UpdateBoundsAndRedrawPopup();
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller_common_.RegisterKeyPressCallback();
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (observer_)
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    observer_->OnPopupShown(display_password_);
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordGenerationPopupControllerImpl::HideAndDestroy() {
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Hide();
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordGenerationPopupControllerImpl::Hide() {
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller_common_.RemoveKeyPressCallback();
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (view_)
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_->Hide();
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (observer_)
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    observer_->OnPopupHidden();
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete this;
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordGenerationPopupControllerImpl::ViewDestroyed() {
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_ = NULL;
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Hide();
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordGenerationPopupControllerImpl::OnSavedPasswordsLinkClicked() {
2161675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  chrome::ShowSettingsSubPage(
2171675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      chrome::FindBrowserWithWebContents(controller_common_.web_contents()),
2181675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      chrome::kPasswordManagerSubPage);
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordGenerationPopupControllerImpl::SetSelectionAtPoint(
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Point& point) {
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PasswordSelected(view_->IsPointInPasswordBounds(point));
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool PasswordGenerationPopupControllerImpl::AcceptSelectedLine() {
227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!password_selected_)
228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return false;
229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  PasswordAccepted();
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return true;
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PasswordGenerationPopupControllerImpl::SelectionCleared() {
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PasswordSelected(false);
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::NativeView PasswordGenerationPopupControllerImpl::container_view() {
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return controller_common_.container_view();
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const gfx::Rect& PasswordGenerationPopupControllerImpl::popup_bounds() const {
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return popup_bounds_;
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool PasswordGenerationPopupControllerImpl::display_password() const {
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return display_password_;
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool PasswordGenerationPopupControllerImpl::password_selected() const {
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return password_selected_;
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 PasswordGenerationPopupControllerImpl::password() const {
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return current_password_;
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 PasswordGenerationPopupControllerImpl::SuggestedText() {
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_PASSWORD_GENERATION_SUGGESTION);
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::string16& PasswordGenerationPopupControllerImpl::HelpText() {
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return help_text_;
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const gfx::Range& PasswordGenerationPopupControllerImpl::HelpTextLinkRange() {
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return link_range_;
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace autofill
271