Commit d517f846 authored by vasilii's avatar vasilii Committed by Commit bot

Create an interface between ChromePasswordManagerClient and ManagePasswordsUIController

BUG=557128

Review URL: https://codereview.chromium.org/1467343002

Cr-Commit-Position: refs/heads/master@{#361309}
parent a00da4ed
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/signin/signin_manager_factory.h"
#include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/profile_sync_service_factory.h"
#include "chrome/browser/ui/autofill/password_generation_popup_controller_impl.h" #include "chrome/browser/ui/autofill/password_generation_popup_controller_impl.h"
#include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" #include "chrome/browser/ui/passwords/passwords_client_ui_delegate.h"
#include "chrome/common/channel_info.h" #include "chrome/common/channel_info.h"
#include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_switches.h"
#include "chrome/common/url_constants.h" #include "chrome/common/url_constants.h"
...@@ -218,8 +218,8 @@ bool ChromePasswordManagerClient::PromptUserToSaveOrUpdatePassword( ...@@ -218,8 +218,8 @@ bool ChromePasswordManagerClient::PromptUserToSaveOrUpdatePassword(
} }
if (IsTheHotNewBubbleUIEnabled()) { if (IsTheHotNewBubbleUIEnabled()) {
ManagePasswordsUIController* manage_passwords_ui_controller = PasswordsClientUIDelegate* manage_passwords_ui_controller =
ManagePasswordsUIController::FromWebContents(web_contents()); PasswordsClientUIDelegateFromWebContents(web_contents());
if (update_password && IsUpdatePasswordUIEnabled()) { if (update_password && IsUpdatePasswordUIEnabled()) {
manage_passwords_ui_controller->OnUpdatePasswordSubmitted( manage_passwords_ui_controller->OnUpdatePasswordSubmitted(
form_to_save.Pass()); form_to_save.Pass());
...@@ -248,9 +248,9 @@ bool ChromePasswordManagerClient::PromptUserToChooseCredentials( ...@@ -248,9 +248,9 @@ bool ChromePasswordManagerClient::PromptUserToChooseCredentials(
ScopedVector<autofill::PasswordForm> federated_forms, ScopedVector<autofill::PasswordForm> federated_forms,
const GURL& origin, const GURL& origin,
base::Callback<void(const password_manager::CredentialInfo&)> callback) { base::Callback<void(const password_manager::CredentialInfo&)> callback) {
return ManagePasswordsUIController::FromWebContents(web_contents())-> return PasswordsClientUIDelegateFromWebContents(web_contents())
OnChooseCredentials(local_forms.Pass(), federated_forms.Pass(), origin, ->OnChooseCredentials(local_forms.Pass(), federated_forms.Pass(), origin,
callback); callback);
} }
void ChromePasswordManagerClient::ForceSavePassword() { void ChromePasswordManagerClient::ForceSavePassword() {
...@@ -265,8 +265,8 @@ void ChromePasswordManagerClient::NotifyUserAutoSignin( ...@@ -265,8 +265,8 @@ void ChromePasswordManagerClient::NotifyUserAutoSignin(
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
ShowAutoSigninPrompt(web_contents(), local_forms[0]->username_value); ShowAutoSigninPrompt(web_contents(), local_forms[0]->username_value);
#else #else
ManagePasswordsUIController::FromWebContents(web_contents())-> PasswordsClientUIDelegateFromWebContents(web_contents())
OnAutoSignin(local_forms.Pass()); ->OnAutoSignin(local_forms.Pass());
#endif #endif
} }
...@@ -277,8 +277,8 @@ void ChromePasswordManagerClient::AutomaticPasswordSave( ...@@ -277,8 +277,8 @@ void ChromePasswordManagerClient::AutomaticPasswordSave(
GeneratedPasswordSavedInfoBarDelegateAndroid::Create(web_contents()); GeneratedPasswordSavedInfoBarDelegateAndroid::Create(web_contents());
#else #else
if (IsTheHotNewBubbleUIEnabled()) { if (IsTheHotNewBubbleUIEnabled()) {
ManagePasswordsUIController* manage_passwords_ui_controller = PasswordsClientUIDelegate* manage_passwords_ui_controller =
ManagePasswordsUIController::FromWebContents(web_contents()); PasswordsClientUIDelegateFromWebContents(web_contents());
manage_passwords_ui_controller->OnAutomaticPasswordSave( manage_passwords_ui_controller->OnAutomaticPasswordSave(
saved_form.Pass()); saved_form.Pass());
} }
...@@ -288,8 +288,8 @@ void ChromePasswordManagerClient::AutomaticPasswordSave( ...@@ -288,8 +288,8 @@ void ChromePasswordManagerClient::AutomaticPasswordSave(
void ChromePasswordManagerClient::PasswordWasAutofilled( void ChromePasswordManagerClient::PasswordWasAutofilled(
const autofill::PasswordFormMap& best_matches, const autofill::PasswordFormMap& best_matches,
const GURL& origin) const { const GURL& origin) const {
ManagePasswordsUIController* manage_passwords_ui_controller = PasswordsClientUIDelegate* manage_passwords_ui_controller =
ManagePasswordsUIController::FromWebContents(web_contents()); PasswordsClientUIDelegateFromWebContents(web_contents());
if (manage_passwords_ui_controller && IsTheHotNewBubbleUIEnabled()) if (manage_passwords_ui_controller && IsTheHotNewBubbleUIEnabled())
manage_passwords_ui_controller->OnPasswordAutofilled(best_matches, origin); manage_passwords_ui_controller->OnPasswordAutofilled(best_matches, origin);
} }
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_command_controller.h" #include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" #include "chrome/browser/ui/passwords/passwords_client_ui_delegate.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/interactive_test_utils.h" #include "chrome/test/base/interactive_test_utils.h"
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include "components/password_manager/core/browser/password_manager_metrics_util.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h"
#include "components/password_manager/core/browser/stub_password_manager_client.h" #include "components/password_manager/core/browser/stub_password_manager_client.h"
#include "components/password_manager/core/browser/stub_password_manager_driver.h" #include "components/password_manager/core/browser/stub_password_manager_driver.h"
#include "testing/gtest/include/gtest/gtest.h"
ManagePasswordsTest::ManagePasswordsTest() { ManagePasswordsTest::ManagePasswordsTest() {
} }
...@@ -101,7 +100,7 @@ scoped_ptr<base::HistogramSamples> ManagePasswordsTest::GetSamples( ...@@ -101,7 +100,7 @@ scoped_ptr<base::HistogramSamples> ManagePasswordsTest::GetSamples(
return histogram_tester_.GetHistogramSamplesSinceCreation(histogram).Pass(); return histogram_tester_.GetHistogramSamplesSinceCreation(histogram).Pass();
} }
ManagePasswordsUIController* ManagePasswordsTest::GetController() { PasswordsClientUIDelegate* ManagePasswordsTest::GetController() {
return ManagePasswordsUIController::FromWebContents( return PasswordsClientUIDelegateFromWebContents(
browser()->tab_strip_model()->GetActiveWebContents()); browser()->tab_strip_model()->GetActiveWebContents());
} }
...@@ -13,11 +13,10 @@ ...@@ -13,11 +13,10 @@
#include "components/autofill/core/common/password_form.h" #include "components/autofill/core/common/password_form.h"
#include "components/password_manager/core/common/credential_manager_types.h" #include "components/password_manager/core/common/credential_manager_types.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
class ManagePasswordsUIController;
class ManagePasswordsIconView;
class GURL; class GURL;
class ManagePasswordsIconView;
class PasswordsClientUIDelegate;
// Test class for the various password management view bits and pieces. Sets // Test class for the various password management view bits and pieces. Sets
// up a ManagePasswordsUIControllerMock, and provides some helper methods // up a ManagePasswordsUIControllerMock, and provides some helper methods
...@@ -61,7 +60,7 @@ class ManagePasswordsTest : public InProcessBrowserTest { ...@@ -61,7 +60,7 @@ class ManagePasswordsTest : public InProcessBrowserTest {
autofill::PasswordForm* test_form() { return &test_form_; } autofill::PasswordForm* test_form() { return &test_form_; }
// Get the UI controller for the current WebContents. // Get the UI controller for the current WebContents.
ManagePasswordsUIController* GetController(); PasswordsClientUIDelegate* GetController();
MOCK_METHOD1(OnChooseCredential, MOCK_METHOD1(OnChooseCredential,
void(const password_manager::CredentialInfo&)); void(const password_manager::CredentialInfo&));
......
...@@ -72,40 +72,6 @@ ManagePasswordsUIController::ManagePasswordsUIController( ...@@ -72,40 +72,6 @@ ManagePasswordsUIController::ManagePasswordsUIController(
ManagePasswordsUIController::~ManagePasswordsUIController() {} ManagePasswordsUIController::~ManagePasswordsUIController() {}
void ManagePasswordsUIController::UpdateBubbleAndIconVisibility() {
// If we're not on a "webby" URL (e.g. "chrome://sign-in"), we shouldn't
// display either the bubble or the icon.
if (!BrowsingDataHelper::IsWebScheme(
web_contents()->GetLastCommittedURL().scheme())) {
passwords_data_.OnInactive();
}
#if !defined(OS_ANDROID)
Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
if (!browser)
return;
LocationBar* location_bar = browser->window()->GetLocationBar();
DCHECK(location_bar);
location_bar->UpdateManagePasswordsIconAndBubble();
#endif
}
void ManagePasswordsUIController::
UpdateAndroidAccountChooserInfoBarVisibility() {
#if defined(OS_ANDROID)
// Deletes itself on the event from Java counterpart, when user interacts with
// dialog.
AccountChooserDialogAndroid* acccount_chooser_dialog =
new AccountChooserDialogAndroid(web_contents(), this);
acccount_chooser_dialog->ShowDialog();
should_pop_up_bubble_ = false;
#endif
}
base::TimeDelta ManagePasswordsUIController::Elapsed() const {
return timer_ ? timer_->Elapsed() : base::TimeDelta::Max();
}
void ManagePasswordsUIController::OnPasswordSubmitted( void ManagePasswordsUIController::OnPasswordSubmitted(
scoped_ptr<PasswordFormManager> form_manager) { scoped_ptr<PasswordFormManager> form_manager) {
bool show_bubble = !form_manager->IsBlacklisted(); bool show_bubble = !form_manager->IsBlacklisted();
...@@ -191,6 +157,20 @@ void ManagePasswordsUIController::OnLoginsChanged( ...@@ -191,6 +157,20 @@ void ManagePasswordsUIController::OnLoginsChanged(
UpdateBubbleAndIconVisibility(); UpdateBubbleAndIconVisibility();
} }
#if !defined(OS_ANDROID)
void ManagePasswordsUIController::UpdateIconAndBubbleState(
ManagePasswordsIconView* icon) {
if (should_pop_up_bubble_) {
// We must display the icon before showing the bubble, as the bubble would
// be otherwise unanchored.
icon->SetState(GetState());
ShowBubbleWithoutUserInteraction();
} else {
icon->SetState(GetState());
}
}
#endif
const GURL& ManagePasswordsUIController::GetOrigin() const { const GURL& ManagePasswordsUIController::GetOrigin() const {
return passwords_data_.origin(); return passwords_data_.origin();
} }
...@@ -360,6 +340,28 @@ void ManagePasswordsUIController::NeverSavePasswordInternal() { ...@@ -360,6 +340,28 @@ void ManagePasswordsUIController::NeverSavePasswordInternal() {
form_manager->PermanentlyBlacklist(); form_manager->PermanentlyBlacklist();
} }
void ManagePasswordsUIController::UpdateBubbleAndIconVisibility() {
// If we're not on a "webby" URL (e.g. "chrome://sign-in"), we shouldn't
// display either the bubble or the icon.
if (!BrowsingDataHelper::IsWebScheme(
web_contents()->GetLastCommittedURL().scheme())) {
passwords_data_.OnInactive();
}
#if !defined(OS_ANDROID)
Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
if (!browser)
return;
LocationBar* location_bar = browser->window()->GetLocationBar();
DCHECK(location_bar);
location_bar->UpdateManagePasswordsIconAndBubble();
#endif
}
base::TimeDelta ManagePasswordsUIController::Elapsed() const {
return timer_ ? timer_->Elapsed() : base::TimeDelta::Max();
}
void ManagePasswordsUIController::DidNavigateMainFrame( void ManagePasswordsUIController::DidNavigateMainFrame(
const content::LoadCommittedDetails& details, const content::LoadCommittedDetails& details,
const content::FrameNavigateParams& params) { const content::FrameNavigateParams& params) {
...@@ -386,20 +388,6 @@ void ManagePasswordsUIController::WasHidden() { ...@@ -386,20 +388,6 @@ void ManagePasswordsUIController::WasHidden() {
#endif #endif
} }
#if !defined(OS_ANDROID)
void ManagePasswordsUIController::UpdateIconAndBubbleState(
ManagePasswordsIconView* icon) {
if (should_pop_up_bubble_) {
// We must display the icon before showing the bubble, as the bubble would
// be otherwise unanchored.
icon->SetState(GetState());
ShowBubbleWithoutUserInteraction();
} else {
icon->SetState(GetState());
}
}
#endif
void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() {
DCHECK(should_pop_up_bubble_); DCHECK(should_pop_up_bubble_);
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID)
...@@ -418,3 +406,15 @@ void ManagePasswordsUIController::WebContentsDestroyed() { ...@@ -418,3 +406,15 @@ void ManagePasswordsUIController::WebContentsDestroyed() {
if (password_store) if (password_store)
password_store->RemoveObserver(this); password_store->RemoveObserver(this);
} }
void ManagePasswordsUIController::
UpdateAndroidAccountChooserInfoBarVisibility() {
#if defined(OS_ANDROID)
// Deletes itself on the event from Java counterpart, when user interacts with
// dialog.
AccountChooserDialogAndroid* acccount_chooser_dialog =
new AccountChooserDialogAndroid(web_contents(), this);
acccount_chooser_dialog->ShowDialog();
should_pop_up_bubble_ = false;
#endif
}
...@@ -5,13 +5,10 @@ ...@@ -5,13 +5,10 @@
#ifndef CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_ #ifndef CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_
#define CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_ #define CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_
#include <vector>
#include "base/memory/scoped_vector.h"
#include "base/timer/elapsed_timer.h" #include "base/timer/elapsed_timer.h"
#include "chrome/browser/ui/passwords/manage_passwords_state.h" #include "chrome/browser/ui/passwords/manage_passwords_state.h"
#include "chrome/browser/ui/passwords/passwords_client_ui_delegate.h"
#include "chrome/browser/ui/passwords/passwords_model_delegate.h" #include "chrome/browser/ui/passwords/passwords_model_delegate.h"
#include "components/autofill/core/common/password_form.h"
#include "components/password_manager/core/browser/password_store.h" #include "components/password_manager/core/browser/password_store.h"
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h" #include "content/public/browser/web_contents_user_data.h"
...@@ -34,50 +31,29 @@ class ManagePasswordsUIController ...@@ -34,50 +31,29 @@ class ManagePasswordsUIController
: public content::WebContentsObserver, : public content::WebContentsObserver,
public content::WebContentsUserData<ManagePasswordsUIController>, public content::WebContentsUserData<ManagePasswordsUIController>,
public password_manager::PasswordStore::Observer, public password_manager::PasswordStore::Observer,
public PasswordsModelDelegate { public PasswordsModelDelegate,
public PasswordsClientUIDelegate {
public: public:
~ManagePasswordsUIController() override; ~ManagePasswordsUIController() override;
// Called when the user submits a form containing login information, so we // PasswordsClientUIDelegate:
// can handle later requests to save or blacklist that login information.
// This stores the provided object and triggers the UI to prompt the user
// about whether they would like to save the password.
void OnPasswordSubmitted( void OnPasswordSubmitted(
scoped_ptr<password_manager::PasswordFormManager> form_manager); scoped_ptr<password_manager::PasswordFormManager> form_manager) override;
// Called when the user submits a change password form, so we can handle
// later requests to update stored credentials in the PasswordManager.
// This stores the provided object and triggers the UI to prompt the user
// about whether they would like to update the password.
void OnUpdatePasswordSubmitted( void OnUpdatePasswordSubmitted(
scoped_ptr<password_manager::PasswordFormManager> form_manager); scoped_ptr<password_manager::PasswordFormManager> form_manager) override;
// Called when the site asks user to choose from credentials. This triggers
// the UI to prompt the user. |local_credentials| and |federated_credentials|
// shouldn't both be empty.
bool OnChooseCredentials( bool OnChooseCredentials(
ScopedVector<autofill::PasswordForm> local_credentials, ScopedVector<autofill::PasswordForm> local_credentials,
ScopedVector<autofill::PasswordForm> federated_credentials, ScopedVector<autofill::PasswordForm> federated_credentials,
const GURL& origin, const GURL& origin,
base::Callback<void(const password_manager::CredentialInfo&)> callback); base::Callback<void(const password_manager::CredentialInfo&)> callback)
override;
// Called when user is auto signed in to the site. |local_forms[0]| contains void OnAutoSignin(ScopedVector<autofill::PasswordForm> local_forms) override;
// the credential returned to the site.
void OnAutoSignin(ScopedVector<autofill::PasswordForm> local_forms);
// Called when the password will be saved automatically, but we still wish to
// visually inform the user that the save has occured.
void OnAutomaticPasswordSave( void OnAutomaticPasswordSave(
scoped_ptr<password_manager::PasswordFormManager> form_manager); scoped_ptr<password_manager::PasswordFormManager> form_manager) override;
// Called when a form is autofilled with login information, so we can manage
// password credentials for the current site which are stored in
// |password_form_map|. This stores a copy of |password_form_map| and shows
// the manage password icon.
void OnPasswordAutofilled(const autofill::PasswordFormMap& password_form_map, void OnPasswordAutofilled(const autofill::PasswordFormMap& password_form_map,
const GURL& origin); const GURL& origin) override;
// PasswordStore::Observer implementation. // PasswordStore::Observer:
void OnLoginsChanged( void OnLoginsChanged(
const password_manager::PasswordStoreChangeList& changes) override; const password_manager::PasswordStoreChangeList& changes) override;
......
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/passwords/passwords_client_ui_delegate.h"
#include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
PasswordsClientUIDelegate* PasswordsClientUIDelegateFromWebContents(
content::WebContents* web_contents) {
DCHECK(web_contents);
return ManagePasswordsUIController::FromWebContents(web_contents);
}
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_PASSWORDS_PASSWORDS_CLIENT_UI_DELEGATE_H_
#define CHROME_BROWSER_UI_PASSWORDS_PASSWORDS_CLIENT_UI_DELEGATE_H_
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "components/autofill/core/common/password_form.h"
namespace content {
class WebContents;
}
namespace password_manager {
struct CredentialInfo;
class PasswordFormManager;
}
// An interface for ChromePasswordManagerClient implemented by
// ManagePasswordsUIController. Allows to push a new state for the tab.
class PasswordsClientUIDelegate {
public:
// Called when the user submits a form containing login information, so the
// later requests to save or blacklist can be handled.
// This stores the provided object and triggers the UI to prompt the user
// about whether they would like to save the password.
virtual void OnPasswordSubmitted(
scoped_ptr<password_manager::PasswordFormManager> form_manager) = 0;
// Called when the user submits a new password for an existing credential.
// This stores the provided object and triggers the UI to prompt the user
// about whether they would like to update the password.
virtual void OnUpdatePasswordSubmitted(
scoped_ptr<password_manager::PasswordFormManager> form_manager) = 0;
// Called when the site asks user to choose from credentials. This triggers
// the UI to prompt the user. |local_credentials| and |federated_credentials|
// shouldn't both be empty.
// Returns true when the UI is shown. |callback| is called when the user made
// a decision. If the UI isn't shown the method returns false and doesn't call
// |callback|.
virtual bool OnChooseCredentials(
ScopedVector<autofill::PasswordForm> local_credentials,
ScopedVector<autofill::PasswordForm> federated_credentials,
const GURL& origin,
base::Callback<void(const password_manager::CredentialInfo&)>
callback) = 0;
// Called when user is auto signed in to the site. |local_forms[0]| contains
// the credential returned to the site.
virtual void OnAutoSignin(
ScopedVector<autofill::PasswordForm> local_forms) = 0;
// Called when the password will be saved automatically, but we still wish to
// visually inform the user that the save has occured.
virtual void OnAutomaticPasswordSave(
scoped_ptr<password_manager::PasswordFormManager> form_manager) = 0;
// Called when a form is autofilled with login information, so we can manage
// password credentials for the current site which are stored in
// |password_form_map|. This stores a copy of |password_form_map| and shows
// the manage password icon.
virtual void OnPasswordAutofilled(
const autofill::PasswordFormMap& password_form_map,
const GURL& origin) = 0;
protected:
virtual ~PasswordsClientUIDelegate() = default;
};
// Returns ManagePasswordsUIController instance for |contents|
PasswordsClientUIDelegate* PasswordsClientUIDelegateFromWebContents(
content::WebContents* web_contents);
#endif // CHROME_BROWSER_UI_PASSWORDS_PASSWORDS_CLIENT_UI_DELEGATE_H_
...@@ -118,6 +118,8 @@ ...@@ -118,6 +118,8 @@
'browser/ui/passwords/manage_passwords_ui_controller.h', 'browser/ui/passwords/manage_passwords_ui_controller.h',
'browser/ui/passwords/manage_passwords_view_utils.cc', 'browser/ui/passwords/manage_passwords_view_utils.cc',
'browser/ui/passwords/manage_passwords_view_utils.h', 'browser/ui/passwords/manage_passwords_view_utils.h',
'browser/ui/passwords/passwords_client_ui_delegate.cc',
'browser/ui/passwords/passwords_client_ui_delegate.h',
'browser/ui/passwords/passwords_model_delegate.cc', 'browser/ui/passwords/passwords_model_delegate.cc',
'browser/ui/passwords/passwords_model_delegate.h', 'browser/ui/passwords/passwords_model_delegate.h',
'browser/ui/passwords/password_manager_presenter.cc', 'browser/ui/passwords/password_manager_presenter.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment