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