| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/autofill/content/renderer/password_autofill_agent.h" | 5 #include "components/autofill/content/renderer/password_autofill_agent.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <string> | 10 #include <string> |
| 11 #include <utility> | 11 #include <utility> |
| 12 | 12 |
| 13 #include "base/bind.h" | 13 #include "base/bind.h" |
| 14 #include "base/i18n/case_conversion.h" | 14 #include "base/i18n/case_conversion.h" |
| 15 #include "base/memory/linked_ptr.h" | 15 #include "base/memory/linked_ptr.h" |
| 16 #include "base/memory/ptr_util.h" | 16 #include "base/memory/ptr_util.h" |
| 17 #include "base/memory/scoped_vector.h" |
| 17 #include "base/message_loop/message_loop.h" | 18 #include "base/message_loop/message_loop.h" |
| 18 #include "base/metrics/histogram_macros.h" | 19 #include "base/metrics/histogram_macros.h" |
| 20 #include "base/strings/string_util.h" |
| 19 #include "base/strings/utf_string_conversions.h" | 21 #include "base/strings/utf_string_conversions.h" |
| 20 #include "build/build_config.h" | 22 #include "build/build_config.h" |
| 21 #include "components/autofill/content/common/autofill_messages.h" | |
| 22 #include "components/autofill/content/renderer/form_autofill_util.h" | 23 #include "components/autofill/content/renderer/form_autofill_util.h" |
| 23 #include "components/autofill/content/renderer/password_form_conversion_utils.h" | 24 #include "components/autofill/content/renderer/password_form_conversion_utils.h" |
| 24 #include "components/autofill/content/renderer/renderer_save_password_progress_l
ogger.h" | 25 #include "components/autofill/content/renderer/renderer_save_password_progress_l
ogger.h" |
| 25 #include "components/autofill/core/common/autofill_constants.h" | 26 #include "components/autofill/core/common/autofill_constants.h" |
| 26 #include "components/autofill/core/common/autofill_util.h" | 27 #include "components/autofill/core/common/autofill_util.h" |
| 27 #include "components/autofill/core/common/form_field_data.h" | 28 #include "components/autofill/core/common/form_field_data.h" |
| 28 #include "components/autofill/core/common/password_form_fill_data.h" | 29 #include "components/autofill/core/common/password_form_fill_data.h" |
| 29 #include "content/public/renderer/document_state.h" | 30 #include "content/public/renderer/document_state.h" |
| 30 #include "content/public/renderer/navigation_state.h" | 31 #include "content/public/renderer/navigation_state.h" |
| 31 #include "content/public/renderer/render_frame.h" | 32 #include "content/public/renderer/render_frame.h" |
| 32 #include "content/public/renderer/render_view.h" | 33 #include "content/public/renderer/render_view.h" |
| 34 #include "services/shell/public/cpp/interface_provider.h" |
| 35 #include "services/shell/public/cpp/interface_registry.h" |
| 33 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" | 36 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" |
| 34 #include "third_party/WebKit/public/platform/WebVector.h" | 37 #include "third_party/WebKit/public/platform/WebVector.h" |
| 35 #include "third_party/WebKit/public/web/WebAutofillClient.h" | 38 #include "third_party/WebKit/public/web/WebAutofillClient.h" |
| 36 #include "third_party/WebKit/public/web/WebDocument.h" | 39 #include "third_party/WebKit/public/web/WebDocument.h" |
| 37 #include "third_party/WebKit/public/web/WebElement.h" | 40 #include "third_party/WebKit/public/web/WebElement.h" |
| 38 #include "third_party/WebKit/public/web/WebFormElement.h" | 41 #include "third_party/WebKit/public/web/WebFormElement.h" |
| 39 #include "third_party/WebKit/public/web/WebInputEvent.h" | 42 #include "third_party/WebKit/public/web/WebInputEvent.h" |
| 40 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 43 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| 41 #include "third_party/WebKit/public/web/WebNode.h" | 44 #include "third_party/WebKit/public/web/WebNode.h" |
| 42 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" | 45 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" |
| (...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 | 574 |
| 572 } // namespace | 575 } // namespace |
| 573 | 576 |
| 574 //////////////////////////////////////////////////////////////////////////////// | 577 //////////////////////////////////////////////////////////////////////////////// |
| 575 // PasswordAutofillAgent, public: | 578 // PasswordAutofillAgent, public: |
| 576 | 579 |
| 577 PasswordAutofillAgent::PasswordAutofillAgent(content::RenderFrame* render_frame) | 580 PasswordAutofillAgent::PasswordAutofillAgent(content::RenderFrame* render_frame) |
| 578 : content::RenderFrameObserver(render_frame), | 581 : content::RenderFrameObserver(render_frame), |
| 579 logging_state_active_(false), | 582 logging_state_active_(false), |
| 580 was_username_autofilled_(false), | 583 was_username_autofilled_(false), |
| 581 was_password_autofilled_(false) { | 584 was_password_autofilled_(false), |
| 582 Send(new AutofillHostMsg_PasswordAutofillAgentConstructed(routing_id())); | 585 binding_(this) { |
| 586 // PasswordAutofillAgent is guaranteed to outlive |render_frame|. |
| 587 render_frame->GetInterfaceRegistry()->AddInterface( |
| 588 base::Bind(&PasswordAutofillAgent::BindRequest, base::Unretained(this))); |
| 589 GetPasswordManagerDriver()->PasswordAutofillAgentConstructed(); |
| 583 } | 590 } |
| 584 | 591 |
| 585 PasswordAutofillAgent::~PasswordAutofillAgent() { | 592 PasswordAutofillAgent::~PasswordAutofillAgent() { |
| 586 } | 593 } |
| 587 | 594 |
| 595 void PasswordAutofillAgent::BindRequest( |
| 596 mojom::PasswordAutofillAgentRequest request) { |
| 597 binding_.Bind(std::move(request)); |
| 598 } |
| 599 |
| 588 void PasswordAutofillAgent::SetAutofillAgent(AutofillAgent* autofill_agent) { | 600 void PasswordAutofillAgent::SetAutofillAgent(AutofillAgent* autofill_agent) { |
| 589 autofill_agent_ = autofill_agent; | 601 autofill_agent_ = autofill_agent; |
| 590 } | 602 } |
| 591 | 603 |
| 592 PasswordAutofillAgent::PasswordValueGatekeeper::PasswordValueGatekeeper() | 604 PasswordAutofillAgent::PasswordValueGatekeeper::PasswordValueGatekeeper() |
| 593 : was_user_gesture_seen_(false) { | 605 : was_user_gesture_seen_(false) { |
| 594 } | 606 } |
| 595 | 607 |
| 596 PasswordAutofillAgent::PasswordValueGatekeeper::~PasswordValueGatekeeper() { | 608 PasswordAutofillAgent::PasswordValueGatekeeper::~PasswordValueGatekeeper() { |
| 597 } | 609 } |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 912 if (form_util::IsFormVisible(frame, provisionally_saved_form_->action, | 924 if (form_util::IsFormVisible(frame, provisionally_saved_form_->action, |
| 913 provisionally_saved_form_->origin, | 925 provisionally_saved_form_->origin, |
| 914 provisionally_saved_form_->form_data) || | 926 provisionally_saved_form_->form_data) || |
| 915 IsUnownedPasswordFormVisible(frame, provisionally_saved_form_->action, | 927 IsUnownedPasswordFormVisible(frame, provisionally_saved_form_->action, |
| 916 provisionally_saved_form_->origin, | 928 provisionally_saved_form_->origin, |
| 917 provisionally_saved_form_->form_data, | 929 provisionally_saved_form_->form_data, |
| 918 form_predictions_)) { | 930 form_predictions_)) { |
| 919 return; | 931 return; |
| 920 } | 932 } |
| 921 | 933 |
| 922 Send(new AutofillHostMsg_InPageNavigation(routing_id(), | 934 GetPasswordManagerDriver()->InPageNavigation(*provisionally_saved_form_); |
| 923 *provisionally_saved_form_)); | |
| 924 provisionally_saved_form_.reset(); | 935 provisionally_saved_form_.reset(); |
| 925 } | 936 } |
| 926 | 937 |
| 927 void PasswordAutofillAgent::FirstUserGestureObserved() { | 938 void PasswordAutofillAgent::FirstUserGestureObserved() { |
| 928 gatekeeper_.OnUserGesture(); | 939 gatekeeper_.OnUserGesture(); |
| 929 } | 940 } |
| 930 | 941 |
| 931 void PasswordAutofillAgent::SendPasswordForms(bool only_visible) { | 942 void PasswordAutofillAgent::SendPasswordForms(bool only_visible) { |
| 932 std::unique_ptr<RendererSavePasswordProgressLogger> logger; | 943 std::unique_ptr<RendererSavePasswordProgressLogger> logger; |
| 933 if (logging_state_active_) { | 944 if (logging_state_active_) { |
| 934 logger.reset(new RendererSavePasswordProgressLogger(this, routing_id())); | 945 logger.reset(new RendererSavePasswordProgressLogger( |
| 946 GetPasswordManagerDriver().get())); |
| 935 logger->LogMessage(Logger::STRING_SEND_PASSWORD_FORMS_METHOD); | 947 logger->LogMessage(Logger::STRING_SEND_PASSWORD_FORMS_METHOD); |
| 936 logger->LogBoolean(Logger::STRING_ONLY_VISIBLE, only_visible); | 948 logger->LogBoolean(Logger::STRING_ONLY_VISIBLE, only_visible); |
| 937 } | 949 } |
| 938 | 950 |
| 939 blink::WebFrame* frame = render_frame()->GetWebFrame(); | 951 blink::WebFrame* frame = render_frame()->GetWebFrame(); |
| 940 // Make sure that this security origin is allowed to use password manager. | 952 // Make sure that this security origin is allowed to use password manager. |
| 941 blink::WebSecurityOrigin origin = frame->document().getSecurityOrigin(); | 953 blink::WebSecurityOrigin origin = frame->document().getSecurityOrigin(); |
| 942 if (logger) { | 954 if (logger) { |
| 943 logger->LogURL(Logger::STRING_SECURITY_ORIGIN, | 955 logger->LogURL(Logger::STRING_SECURITY_ORIGIN, |
| 944 GURL(origin.toString().utf8())); | 956 GURL(origin.toString().utf8())); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1019 if (password_forms.empty() && !only_visible) { | 1031 if (password_forms.empty() && !only_visible) { |
| 1020 // We need to send the PasswordFormsRendered message regardless of whether | 1032 // We need to send the PasswordFormsRendered message regardless of whether |
| 1021 // there are any forms visible, as this is also the code path that triggers | 1033 // there are any forms visible, as this is also the code path that triggers |
| 1022 // showing the infobar. | 1034 // showing the infobar. |
| 1023 return; | 1035 return; |
| 1024 } | 1036 } |
| 1025 | 1037 |
| 1026 if (only_visible) { | 1038 if (only_visible) { |
| 1027 blink::WebFrame* main_frame = render_frame()->GetWebFrame()->top(); | 1039 blink::WebFrame* main_frame = render_frame()->GetWebFrame()->top(); |
| 1028 bool did_stop_loading = !main_frame || !main_frame->isLoading(); | 1040 bool did_stop_loading = !main_frame || !main_frame->isLoading(); |
| 1029 Send(new AutofillHostMsg_PasswordFormsRendered(routing_id(), password_forms, | 1041 GetPasswordManagerDriver()->PasswordFormsRendered(password_forms, |
| 1030 did_stop_loading)); | 1042 did_stop_loading); |
| 1031 } else { | 1043 } else { |
| 1032 Send(new AutofillHostMsg_PasswordFormsParsed(routing_id(), password_forms)); | 1044 GetPasswordManagerDriver()->PasswordFormsParsed(password_forms); |
| 1033 } | 1045 } |
| 1034 } | 1046 } |
| 1035 | 1047 |
| 1036 bool PasswordAutofillAgent::OnMessageReceived(const IPC::Message& message) { | |
| 1037 bool handled = true; | |
| 1038 IPC_BEGIN_MESSAGE_MAP(PasswordAutofillAgent, message) | |
| 1039 IPC_MESSAGE_HANDLER(AutofillMsg_FillPasswordForm, OnFillPasswordForm) | |
| 1040 IPC_MESSAGE_HANDLER(AutofillMsg_SetLoggingState, OnSetLoggingState) | |
| 1041 IPC_MESSAGE_HANDLER(AutofillMsg_AutofillUsernameAndPasswordDataReceived, | |
| 1042 OnAutofillUsernameAndPasswordDataReceived) | |
| 1043 IPC_MESSAGE_HANDLER(AutofillMsg_FindFocusedPasswordForm, | |
| 1044 OnFindFocusedPasswordForm) | |
| 1045 IPC_MESSAGE_UNHANDLED(handled = false) | |
| 1046 IPC_END_MESSAGE_MAP() | |
| 1047 return handled; | |
| 1048 } | |
| 1049 | |
| 1050 void PasswordAutofillAgent::DidFinishDocumentLoad() { | 1048 void PasswordAutofillAgent::DidFinishDocumentLoad() { |
| 1051 // The |frame| contents have been parsed, but not yet rendered. Let the | 1049 // The |frame| contents have been parsed, but not yet rendered. Let the |
| 1052 // PasswordManager know that forms are loaded, even though we can't yet tell | 1050 // PasswordManager know that forms are loaded, even though we can't yet tell |
| 1053 // whether they're visible. | 1051 // whether they're visible. |
| 1054 form_util::ScopedLayoutPreventer layout_preventer; | 1052 form_util::ScopedLayoutPreventer layout_preventer; |
| 1055 SendPasswordForms(false); | 1053 SendPasswordForms(false); |
| 1056 } | 1054 } |
| 1057 | 1055 |
| 1058 void PasswordAutofillAgent::DidFinishLoad() { | 1056 void PasswordAutofillAgent::DidFinishLoad() { |
| 1059 // The |frame| contents have been rendered. Let the PasswordManager know | 1057 // The |frame| contents have been rendered. Let the PasswordManager know |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1073 OnSamePageNavigationCompleted(); | 1071 OnSamePageNavigationCompleted(); |
| 1074 } | 1072 } |
| 1075 } | 1073 } |
| 1076 | 1074 |
| 1077 void PasswordAutofillAgent::FrameDetached() { | 1075 void PasswordAutofillAgent::FrameDetached() { |
| 1078 // If a sub frame has been destroyed while the user was entering information | 1076 // If a sub frame has been destroyed while the user was entering information |
| 1079 // into a password form, try to save the data. See https://crbug.com/450806 | 1077 // into a password form, try to save the data. See https://crbug.com/450806 |
| 1080 // for examples of sites that perform login using this technique. | 1078 // for examples of sites that perform login using this technique. |
| 1081 if (render_frame()->GetWebFrame()->parent() && | 1079 if (render_frame()->GetWebFrame()->parent() && |
| 1082 ProvisionallySavedPasswordIsValid()) { | 1080 ProvisionallySavedPasswordIsValid()) { |
| 1083 Send(new AutofillHostMsg_InPageNavigation(routing_id(), | 1081 GetPasswordManagerDriver()->InPageNavigation(*provisionally_saved_form_); |
| 1084 *provisionally_saved_form_)); | |
| 1085 } | 1082 } |
| 1086 FrameClosing(); | 1083 FrameClosing(); |
| 1087 } | 1084 } |
| 1088 | 1085 |
| 1089 void PasswordAutofillAgent::WillSendSubmitEvent( | 1086 void PasswordAutofillAgent::WillSendSubmitEvent( |
| 1090 const blink::WebFormElement& form) { | 1087 const blink::WebFormElement& form) { |
| 1091 // Forms submitted via XHR are not seen by WillSubmitForm if the default | 1088 // Forms submitted via XHR are not seen by WillSubmitForm if the default |
| 1092 // onsubmit handler is overridden. Such submission first gets detected in | 1089 // onsubmit handler is overridden. Such submission first gets detected in |
| 1093 // DidStartProvisionalLoad, which no longer knows about the particular form, | 1090 // DidStartProvisionalLoad, which no longer knows about the particular form, |
| 1094 // and uses the candidate stored in |provisionally_saved_form_|. | 1091 // and uses the candidate stored in |provisionally_saved_form_|. |
| 1095 // | 1092 // |
| 1096 // User-typed password will get stored to |provisionally_saved_form_| in | 1093 // User-typed password will get stored to |provisionally_saved_form_| in |
| 1097 // TextDidChangeInTextField. Autofilled or JavaScript-copied passwords need to | 1094 // TextDidChangeInTextField. Autofilled or JavaScript-copied passwords need to |
| 1098 // be saved here. | 1095 // be saved here. |
| 1099 // | 1096 // |
| 1100 // Only non-empty passwords are saved here. Empty passwords were likely | 1097 // Only non-empty passwords are saved here. Empty passwords were likely |
| 1101 // cleared by some scripts (http://crbug.com/28910, http://crbug.com/391693). | 1098 // cleared by some scripts (http://crbug.com/28910, http://crbug.com/391693). |
| 1102 // Had the user cleared the password, |provisionally_saved_form_| would | 1099 // Had the user cleared the password, |provisionally_saved_form_| would |
| 1103 // already have been updated in TextDidChangeInTextField. | 1100 // already have been updated in TextDidChangeInTextField. |
| 1104 std::unique_ptr<PasswordForm> password_form = CreatePasswordFormFromWebForm( | 1101 std::unique_ptr<PasswordForm> password_form = CreatePasswordFormFromWebForm( |
| 1105 form, &field_value_and_properties_map_, &form_predictions_); | 1102 form, &field_value_and_properties_map_, &form_predictions_); |
| 1106 ProvisionallySavePassword(std::move(password_form), | 1103 ProvisionallySavePassword(std::move(password_form), |
| 1107 RESTRICTION_NON_EMPTY_PASSWORD); | 1104 RESTRICTION_NON_EMPTY_PASSWORD); |
| 1108 } | 1105 } |
| 1109 | 1106 |
| 1110 void PasswordAutofillAgent::WillSubmitForm(const blink::WebFormElement& form) { | 1107 void PasswordAutofillAgent::WillSubmitForm(const blink::WebFormElement& form) { |
| 1111 std::unique_ptr<RendererSavePasswordProgressLogger> logger; | 1108 std::unique_ptr<RendererSavePasswordProgressLogger> logger; |
| 1112 if (logging_state_active_) { | 1109 if (logging_state_active_) { |
| 1113 logger.reset(new RendererSavePasswordProgressLogger(this, routing_id())); | 1110 logger.reset(new RendererSavePasswordProgressLogger( |
| 1111 GetPasswordManagerDriver().get())); |
| 1114 logger->LogMessage(Logger::STRING_WILL_SUBMIT_FORM_METHOD); | 1112 logger->LogMessage(Logger::STRING_WILL_SUBMIT_FORM_METHOD); |
| 1115 LogHTMLForm(logger.get(), Logger::STRING_HTML_FORM_FOR_SUBMIT, form); | 1113 LogHTMLForm(logger.get(), Logger::STRING_HTML_FORM_FOR_SUBMIT, form); |
| 1116 } | 1114 } |
| 1117 | 1115 |
| 1118 std::unique_ptr<PasswordForm> submitted_form = CreatePasswordFormFromWebForm( | 1116 std::unique_ptr<PasswordForm> submitted_form = CreatePasswordFormFromWebForm( |
| 1119 form, &field_value_and_properties_map_, &form_predictions_); | 1117 form, &field_value_and_properties_map_, &form_predictions_); |
| 1120 | 1118 |
| 1121 // If there is a provisionally saved password, copy over the previous | 1119 // If there is a provisionally saved password, copy over the previous |
| 1122 // password value so we get the user's typed password, not the value that | 1120 // password value so we get the user's typed password, not the value that |
| 1123 // may have been transformed for submit. | 1121 // may have been transformed for submit. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1137 submitted_form->new_password_value = | 1135 submitted_form->new_password_value = |
| 1138 provisionally_saved_form_->new_password_value; | 1136 provisionally_saved_form_->new_password_value; |
| 1139 submitted_form->username_value = | 1137 submitted_form->username_value = |
| 1140 provisionally_saved_form_->username_value; | 1138 provisionally_saved_form_->username_value; |
| 1141 } | 1139 } |
| 1142 | 1140 |
| 1143 // Some observers depend on sending this information now instead of when | 1141 // Some observers depend on sending this information now instead of when |
| 1144 // the frame starts loading. If there are redirects that cause a new | 1142 // the frame starts loading. If there are redirects that cause a new |
| 1145 // RenderView to be instantiated (such as redirects to the WebStore) | 1143 // RenderView to be instantiated (such as redirects to the WebStore) |
| 1146 // we will never get to finish the load. | 1144 // we will never get to finish the load. |
| 1147 Send(new AutofillHostMsg_PasswordFormSubmitted(routing_id(), | 1145 GetPasswordManagerDriver()->PasswordFormSubmitted(*submitted_form); |
| 1148 *submitted_form)); | |
| 1149 provisionally_saved_form_.reset(); | 1146 provisionally_saved_form_.reset(); |
| 1150 } else if (logger) { | 1147 } else if (logger) { |
| 1151 logger->LogMessage(Logger::STRING_FORM_IS_NOT_PASSWORD); | 1148 logger->LogMessage(Logger::STRING_FORM_IS_NOT_PASSWORD); |
| 1152 } | 1149 } |
| 1153 } | 1150 } |
| 1154 | 1151 |
| 1155 void PasswordAutofillAgent::OnDestruct() { | 1152 void PasswordAutofillAgent::OnDestruct() { |
| 1156 base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this); | 1153 base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this); |
| 1157 } | 1154 } |
| 1158 | 1155 |
| 1159 void PasswordAutofillAgent::DidStartProvisionalLoad() { | 1156 void PasswordAutofillAgent::DidStartProvisionalLoad() { |
| 1160 std::unique_ptr<RendererSavePasswordProgressLogger> logger; | 1157 std::unique_ptr<RendererSavePasswordProgressLogger> logger; |
| 1161 if (logging_state_active_) { | 1158 if (logging_state_active_) { |
| 1162 logger.reset(new RendererSavePasswordProgressLogger(this, routing_id())); | 1159 logger.reset(new RendererSavePasswordProgressLogger( |
| 1160 GetPasswordManagerDriver().get())); |
| 1163 logger->LogMessage(Logger::STRING_DID_START_PROVISIONAL_LOAD_METHOD); | 1161 logger->LogMessage(Logger::STRING_DID_START_PROVISIONAL_LOAD_METHOD); |
| 1164 } | 1162 } |
| 1165 | 1163 |
| 1166 const blink::WebLocalFrame* navigated_frame = render_frame()->GetWebFrame(); | 1164 const blink::WebLocalFrame* navigated_frame = render_frame()->GetWebFrame(); |
| 1167 if (navigated_frame->parent()) { | 1165 if (navigated_frame->parent()) { |
| 1168 if (logger) | 1166 if (logger) |
| 1169 logger->LogMessage(Logger::STRING_FRAME_NOT_MAIN_FRAME); | 1167 logger->LogMessage(Logger::STRING_FRAME_NOT_MAIN_FRAME); |
| 1170 return; | 1168 return; |
| 1171 } | 1169 } |
| 1172 | 1170 |
| 1173 // Bug fix for crbug.com/368690. isProcessingUserGesture() is false when | 1171 // Bug fix for crbug.com/368690. isProcessingUserGesture() is false when |
| 1174 // the user is performing actions outside the page (e.g. typed url, | 1172 // the user is performing actions outside the page (e.g. typed url, |
| 1175 // history navigation). We don't want to trigger saving in these cases. | 1173 // history navigation). We don't want to trigger saving in these cases. |
| 1176 content::DocumentState* document_state = | 1174 content::DocumentState* document_state = |
| 1177 content::DocumentState::FromDataSource( | 1175 content::DocumentState::FromDataSource( |
| 1178 navigated_frame->provisionalDataSource()); | 1176 navigated_frame->provisionalDataSource()); |
| 1179 content::NavigationState* navigation_state = | 1177 content::NavigationState* navigation_state = |
| 1180 document_state->navigation_state(); | 1178 document_state->navigation_state(); |
| 1181 ui::PageTransition type = navigation_state->GetTransitionType(); | 1179 ui::PageTransition type = navigation_state->GetTransitionType(); |
| 1182 if (ui::PageTransitionIsWebTriggerable(type) && | 1180 if (ui::PageTransitionIsWebTriggerable(type) && |
| 1183 ui::PageTransitionIsNewNavigation(type) && | 1181 ui::PageTransitionIsNewNavigation(type) && |
| 1184 !blink::WebUserGestureIndicator::isProcessingUserGesture()) { | 1182 !blink::WebUserGestureIndicator::isProcessingUserGesture()) { |
| 1185 // If onsubmit has been called, try and save that form. | 1183 // If onsubmit has been called, try and save that form. |
| 1186 if (provisionally_saved_form_) { | 1184 if (provisionally_saved_form_) { |
| 1187 if (logger) { | 1185 if (logger) { |
| 1188 logger->LogPasswordForm( | 1186 logger->LogPasswordForm( |
| 1189 Logger::STRING_PROVISIONALLY_SAVED_FORM_FOR_FRAME, | 1187 Logger::STRING_PROVISIONALLY_SAVED_FORM_FOR_FRAME, |
| 1190 *provisionally_saved_form_); | 1188 *provisionally_saved_form_); |
| 1191 } | 1189 } |
| 1192 Send(new AutofillHostMsg_PasswordFormSubmitted( | 1190 GetPasswordManagerDriver()->PasswordFormSubmitted( |
| 1193 routing_id(), *provisionally_saved_form_)); | 1191 *provisionally_saved_form_); |
| 1194 provisionally_saved_form_.reset(); | 1192 provisionally_saved_form_.reset(); |
| 1195 } else { | 1193 } else { |
| 1196 ScopedVector<PasswordForm> possible_submitted_forms; | 1194 ScopedVector<PasswordForm> possible_submitted_forms; |
| 1197 // Loop through the forms on the page looking for one that has been | 1195 // Loop through the forms on the page looking for one that has been |
| 1198 // filled out. If one exists, try and save the credentials. | 1196 // filled out. If one exists, try and save the credentials. |
| 1199 blink::WebVector<blink::WebFormElement> forms; | 1197 blink::WebVector<blink::WebFormElement> forms; |
| 1200 render_frame()->GetWebFrame()->document().forms(forms); | 1198 render_frame()->GetWebFrame()->document().forms(forms); |
| 1201 | 1199 |
| 1202 bool password_forms_found = false; | 1200 bool password_forms_found = false; |
| 1203 for (size_t i = 0; i < forms.size(); ++i) { | 1201 for (size_t i = 0; i < forms.size(); ++i) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1217 &form_predictions_)); | 1215 &form_predictions_)); |
| 1218 | 1216 |
| 1219 for (const PasswordForm* password_form : possible_submitted_forms) { | 1217 for (const PasswordForm* password_form : possible_submitted_forms) { |
| 1220 if (password_form && !password_form->username_value.empty() && | 1218 if (password_form && !password_form->username_value.empty() && |
| 1221 FormContainsNonDefaultPasswordValue(*password_form)) { | 1219 FormContainsNonDefaultPasswordValue(*password_form)) { |
| 1222 password_forms_found = true; | 1220 password_forms_found = true; |
| 1223 if (logger) { | 1221 if (logger) { |
| 1224 logger->LogPasswordForm(Logger::STRING_PASSWORD_FORM_FOUND_ON_PAGE, | 1222 logger->LogPasswordForm(Logger::STRING_PASSWORD_FORM_FOUND_ON_PAGE, |
| 1225 *password_form); | 1223 *password_form); |
| 1226 } | 1224 } |
| 1227 Send(new AutofillHostMsg_PasswordFormSubmitted(routing_id(), | 1225 GetPasswordManagerDriver()->PasswordFormSubmitted(*password_form); |
| 1228 *password_form)); | |
| 1229 break; | 1226 break; |
| 1230 } | 1227 } |
| 1231 } | 1228 } |
| 1232 | 1229 |
| 1233 if (!password_forms_found && logger) | 1230 if (!password_forms_found && logger) |
| 1234 logger->LogMessage(Logger::STRING_PASSWORD_FORM_NOT_FOUND_ON_PAGE); | 1231 logger->LogMessage(Logger::STRING_PASSWORD_FORM_NOT_FOUND_ON_PAGE); |
| 1235 } | 1232 } |
| 1236 } | 1233 } |
| 1237 | 1234 |
| 1238 // This is a new navigation, so require a new user gesture before filling in | 1235 // This is a new navigation, so require a new user gesture before filling in |
| 1239 // passwords. | 1236 // passwords. |
| 1240 gatekeeper_.Reset(); | 1237 gatekeeper_.Reset(); |
| 1241 } | 1238 } |
| 1242 | 1239 |
| 1243 void PasswordAutofillAgent::OnFillPasswordForm( | 1240 // mojom::PasswordAutofillAgent: |
| 1241 void PasswordAutofillAgent::FillPasswordForm( |
| 1244 int key, | 1242 int key, |
| 1245 const PasswordFormFillData& form_data) { | 1243 const PasswordFormFillData& form_data) { |
| 1246 std::vector<blink::WebInputElement> elements; | 1244 std::vector<blink::WebInputElement> elements; |
| 1247 std::unique_ptr<RendererSavePasswordProgressLogger> logger; | 1245 std::unique_ptr<RendererSavePasswordProgressLogger> logger; |
| 1248 if (logging_state_active_) { | 1246 if (logging_state_active_) { |
| 1249 logger.reset(new RendererSavePasswordProgressLogger(this, routing_id())); | 1247 logger.reset(new RendererSavePasswordProgressLogger( |
| 1248 GetPasswordManagerDriver().get())); |
| 1250 logger->LogMessage(Logger::STRING_ON_FILL_PASSWORD_FORM_METHOD); | 1249 logger->LogMessage(Logger::STRING_ON_FILL_PASSWORD_FORM_METHOD); |
| 1251 } | 1250 } |
| 1252 GetFillableElementFromFormData(key, form_data, logger.get(), &elements); | 1251 GetFillableElementFromFormData(key, form_data, logger.get(), &elements); |
| 1253 | 1252 |
| 1254 // If wait_for_username is true, we don't want to initially fill the form | 1253 // If wait_for_username is true, we don't want to initially fill the form |
| 1255 // until the user types in a valid username. | 1254 // until the user types in a valid username. |
| 1256 if (form_data.wait_for_username) | 1255 if (form_data.wait_for_username) |
| 1257 return; | 1256 return; |
| 1258 | 1257 |
| 1259 for (auto element : elements) { | 1258 for (auto element : elements) { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1359 const blink::WebElement web_element = node.toConst<blink::WebElement>(); | 1358 const blink::WebElement web_element = node.toConst<blink::WebElement>(); |
| 1360 if (!web_element.isFormControlElement()) | 1359 if (!web_element.isFormControlElement()) |
| 1361 return; | 1360 return; |
| 1362 const blink::WebFormControlElement control_element = | 1361 const blink::WebFormControlElement control_element = |
| 1363 web_element.toConst<blink::WebFormControlElement>(); | 1362 web_element.toConst<blink::WebFormControlElement>(); |
| 1364 UpdateFieldValueAndPropertiesMaskMap(control_element, nullptr, | 1363 UpdateFieldValueAndPropertiesMaskMap(control_element, nullptr, |
| 1365 FieldPropertiesFlags::HAD_FOCUS, | 1364 FieldPropertiesFlags::HAD_FOCUS, |
| 1366 &field_value_and_properties_map_); | 1365 &field_value_and_properties_map_); |
| 1367 } | 1366 } |
| 1368 | 1367 |
| 1369 void PasswordAutofillAgent::OnSetLoggingState(bool active) { | 1368 // mojom::PasswordAutofillAgent: |
| 1369 void PasswordAutofillAgent::SetLoggingState(bool active) { |
| 1370 logging_state_active_ = active; | 1370 logging_state_active_ = active; |
| 1371 } | 1371 } |
| 1372 | 1372 |
| 1373 void PasswordAutofillAgent::OnAutofillUsernameAndPasswordDataReceived( | 1373 void PasswordAutofillAgent::AutofillUsernameAndPasswordDataReceived( |
| 1374 const FormsPredictionsMap& predictions) { | 1374 const FormsPredictionsMap& predictions) { |
| 1375 form_predictions_.insert(predictions.begin(), predictions.end()); | 1375 form_predictions_.insert(predictions.begin(), predictions.end()); |
| 1376 } | 1376 } |
| 1377 | 1377 |
| 1378 void PasswordAutofillAgent::OnFindFocusedPasswordForm() { | 1378 void PasswordAutofillAgent::FindFocusedPasswordForm( |
| 1379 const FindFocusedPasswordFormCallback& callback) { |
| 1379 std::unique_ptr<PasswordForm> password_form; | 1380 std::unique_ptr<PasswordForm> password_form; |
| 1380 | 1381 |
| 1381 blink::WebElement element = | 1382 blink::WebElement element = |
| 1382 render_frame()->GetWebFrame()->document().focusedElement(); | 1383 render_frame()->GetWebFrame()->document().focusedElement(); |
| 1383 if (!element.isNull() && element.hasHTMLTagName("input")) { | 1384 if (!element.isNull() && element.hasHTMLTagName("input")) { |
| 1384 blink::WebInputElement input = element.to<blink::WebInputElement>(); | 1385 blink::WebInputElement input = element.to<blink::WebInputElement>(); |
| 1385 if (input.isPasswordField() && !input.form().isNull()) { | 1386 if (input.isPasswordField() && !input.form().isNull()) { |
| 1386 if (!input.form().isNull()) { | 1387 if (!input.form().isNull()) { |
| 1387 password_form = CreatePasswordFormFromWebForm( | 1388 password_form = CreatePasswordFormFromWebForm( |
| 1388 input.form(), &field_value_and_properties_map_, &form_predictions_); | 1389 input.form(), &field_value_and_properties_map_, &form_predictions_); |
| 1389 } else { | 1390 } else { |
| 1390 password_form = CreatePasswordFormFromUnownedInputElements( | 1391 password_form = CreatePasswordFormFromUnownedInputElements( |
| 1391 *render_frame()->GetWebFrame(), &field_value_and_properties_map_, | 1392 *render_frame()->GetWebFrame(), &field_value_and_properties_map_, |
| 1392 &form_predictions_); | 1393 &form_predictions_); |
| 1393 // Only try to use this form if |input| is one of the password elements | 1394 // Only try to use this form if |input| is one of the password elements |
| 1394 // for |password_form|. | 1395 // for |password_form|. |
| 1395 if (password_form->password_element != input.nameForAutofill() && | 1396 if (password_form->password_element != input.nameForAutofill() && |
| 1396 password_form->new_password_element != input.nameForAutofill()) | 1397 password_form->new_password_element != input.nameForAutofill()) |
| 1397 password_form.reset(); | 1398 password_form.reset(); |
| 1398 } | 1399 } |
| 1399 } | 1400 } |
| 1400 } | 1401 } |
| 1401 | 1402 |
| 1402 if (!password_form) | 1403 if (!password_form) |
| 1403 password_form.reset(new PasswordForm()); | 1404 password_form.reset(new PasswordForm()); |
| 1404 | 1405 |
| 1405 Send(new AutofillHostMsg_FocusedPasswordFormFound( | 1406 callback.Run(*password_form); |
| 1406 routing_id(), *password_form)); | |
| 1407 } | 1407 } |
| 1408 | 1408 |
| 1409 //////////////////////////////////////////////////////////////////////////////// | 1409 //////////////////////////////////////////////////////////////////////////////// |
| 1410 // PasswordAutofillAgent, private: | 1410 // PasswordAutofillAgent, private: |
| 1411 | 1411 |
| 1412 bool PasswordAutofillAgent::ShowSuggestionPopup( | 1412 bool PasswordAutofillAgent::ShowSuggestionPopup( |
| 1413 const PasswordInfo& password_info, | 1413 const PasswordInfo& password_info, |
| 1414 const blink::WebInputElement& user_input, | 1414 const blink::WebInputElement& user_input, |
| 1415 bool show_all, | 1415 bool show_all, |
| 1416 bool show_on_password_field) { | 1416 bool show_on_password_field) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1437 if (show_all) | 1437 if (show_all) |
| 1438 options |= SHOW_ALL; | 1438 options |= SHOW_ALL; |
| 1439 if (show_on_password_field) | 1439 if (show_on_password_field) |
| 1440 options |= IS_PASSWORD_FIELD; | 1440 options |= IS_PASSWORD_FIELD; |
| 1441 | 1441 |
| 1442 base::string16 username_string( | 1442 base::string16 username_string( |
| 1443 user_input.isPasswordField() | 1443 user_input.isPasswordField() |
| 1444 ? base::string16() | 1444 ? base::string16() |
| 1445 : static_cast<base::string16>(user_input.value())); | 1445 : static_cast<base::string16>(user_input.value())); |
| 1446 | 1446 |
| 1447 Send(new AutofillHostMsg_ShowPasswordSuggestions( | 1447 GetPasswordManagerDriver()->ShowPasswordSuggestions( |
| 1448 routing_id(), password_info.key, field.text_direction, username_string, | 1448 password_info.key, field.text_direction, username_string, options, |
| 1449 options, | 1449 render_frame()->GetRenderView()->ElementBoundsInWindow(user_input)); |
| 1450 render_frame()->GetRenderView()->ElementBoundsInWindow(user_input))); | |
| 1451 username_query_prefix_ = username_string; | 1450 username_query_prefix_ = username_string; |
| 1452 return CanShowSuggestion(password_info.fill_data, username_string, show_all); | 1451 return CanShowSuggestion(password_info.fill_data, username_string, show_all); |
| 1453 } | 1452 } |
| 1454 | 1453 |
| 1455 void PasswordAutofillAgent::FrameClosing() { | 1454 void PasswordAutofillAgent::FrameClosing() { |
| 1456 for (auto const& iter : web_input_to_password_info_) { | 1455 for (auto const& iter : web_input_to_password_info_) { |
| 1457 password_to_username_.erase(iter.second.password_field); | 1456 password_to_username_.erase(iter.second.password_field); |
| 1458 } | 1457 } |
| 1459 web_input_to_password_info_.clear(); | 1458 web_input_to_password_info_.clear(); |
| 1460 provisionally_saved_form_.reset(); | 1459 provisionally_saved_form_.reset(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1492 !provisionally_saved_form_->username_value.empty() && | 1491 !provisionally_saved_form_->username_value.empty() && |
| 1493 !(provisionally_saved_form_->password_value.empty() && | 1492 !(provisionally_saved_form_->password_value.empty() && |
| 1494 provisionally_saved_form_->new_password_value.empty()); | 1493 provisionally_saved_form_->new_password_value.empty()); |
| 1495 } | 1494 } |
| 1496 | 1495 |
| 1497 const mojom::AutofillDriverPtr& PasswordAutofillAgent::GetAutofillDriver() { | 1496 const mojom::AutofillDriverPtr& PasswordAutofillAgent::GetAutofillDriver() { |
| 1498 DCHECK(autofill_agent_); | 1497 DCHECK(autofill_agent_); |
| 1499 return autofill_agent_->GetAutofillDriver(); | 1498 return autofill_agent_->GetAutofillDriver(); |
| 1500 } | 1499 } |
| 1501 | 1500 |
| 1501 const mojom::PasswordManagerDriverPtr& |
| 1502 PasswordAutofillAgent::GetPasswordManagerDriver() { |
| 1503 if (!password_manager_driver_) { |
| 1504 render_frame()->GetRemoteInterfaces()->GetInterface( |
| 1505 mojo::GetProxy(&password_manager_driver_)); |
| 1506 } |
| 1507 |
| 1508 return password_manager_driver_; |
| 1509 } |
| 1510 |
| 1502 } // namespace autofill | 1511 } // namespace autofill |
| OLD | NEW |