password_manager_driver_factory.cc 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "weblayer/browser/password_manager_driver_factory.h"
  5. #include "base/memory/raw_ptr.h"
  6. #include "components/password_manager/content/browser/bad_message.h"
  7. #include "components/password_manager/content/browser/form_meta_data.h"
  8. #include "components/site_isolation/site_isolation_policy.h"
  9. #include "content/public/browser/browser_context.h"
  10. #include "content/public/browser/render_frame_host.h"
  11. #include "content/public/browser/web_contents.h"
  12. #include "mojo/public/cpp/bindings/associated_receiver.h"
  13. namespace weblayer {
  14. // A minimal implementation of autofill::mojom::PasswordManagerDriver which just
  15. // listens for the user to type into a password field.
  16. class PasswordManagerDriverFactory::PasswordManagerDriver
  17. : public autofill::mojom::PasswordManagerDriver {
  18. public:
  19. explicit PasswordManagerDriver(content::RenderFrameHost* render_frame_host)
  20. : render_frame_host_(render_frame_host) {}
  21. void BindPendingReceiver(
  22. mojo::PendingAssociatedReceiver<autofill::mojom::PasswordManagerDriver>
  23. pending_receiver) {
  24. password_manager_receiver_.Bind(std::move(pending_receiver));
  25. }
  26. private:
  27. // autofill::mojom::PasswordManagerDriver:
  28. // Note that these messages received from a potentially compromised renderer.
  29. // For that reason, any access to form data should be validated via
  30. // bad_message::CheckChildProcessSecurityPolicy.
  31. void PasswordFormsParsed(
  32. const std::vector<autofill::FormData>& raw_forms_data) override {}
  33. void PasswordFormsRendered(
  34. const std::vector<autofill::FormData>& raw_visible_forms_data) override {}
  35. void PasswordFormSubmitted(const autofill::FormData& raw_form_data) override {
  36. }
  37. void InformAboutUserInput(const autofill::FormData& raw_form_data) override {
  38. autofill::FormData form_data =
  39. password_manager::GetFormWithFrameAndFormMetaData(render_frame_host_,
  40. raw_form_data);
  41. if (FormHasNonEmptyPasswordField(form_data) &&
  42. site_isolation::SiteIsolationPolicy::
  43. IsIsolationForPasswordSitesEnabled()) {
  44. // This function signals that a password field has been filled (whether by
  45. // the user, JS, autofill, or some other means) or a password form has
  46. // been submitted. Use this as a heuristic to start site-isolating the
  47. // form's site. This is intended to be used primarily when full site
  48. // isolation is not used, such as on Android.
  49. content::SiteInstance::StartIsolatingSite(
  50. render_frame_host_->GetSiteInstance()->GetBrowserContext(),
  51. form_data.url,
  52. content::ChildProcessSecurityPolicy::IsolatedOriginSource::
  53. USER_TRIGGERED);
  54. }
  55. }
  56. void DynamicFormSubmission(autofill::mojom::SubmissionIndicatorEvent
  57. submission_indication_event) override {}
  58. void PasswordFormCleared(const autofill::FormData& raw_form_data) override {}
  59. void RecordSavePasswordProgress(const std::string& log) override {}
  60. void UserModifiedPasswordField() override {}
  61. void UserModifiedNonPasswordField(autofill::FieldRendererId renderer_id,
  62. const std::u16string& field_name,
  63. const std::u16string& value) override {}
  64. void ShowPasswordSuggestions(base::i18n::TextDirection text_direction,
  65. const std::u16string& typed_username,
  66. int options,
  67. const gfx::RectF& bounds) override {}
  68. #if BUILDFLAG(IS_ANDROID)
  69. void ShowTouchToFill(
  70. autofill::mojom::SubmissionReadinessState submission_readiness) override {
  71. }
  72. #endif
  73. void CheckSafeBrowsingReputation(const GURL& form_action,
  74. const GURL& frame_url) override {}
  75. void FocusedInputChanged(
  76. autofill::FieldRendererId focused_field_id,
  77. autofill::mojom::FocusedFieldType focused_field_type) override {}
  78. void LogFirstFillingResult(autofill::FormRendererId form_renderer_id,
  79. int32_t result) override {}
  80. mojo::AssociatedReceiver<autofill::mojom::PasswordManagerDriver>
  81. password_manager_receiver_{this};
  82. raw_ptr<content::RenderFrameHost> render_frame_host_;
  83. };
  84. PasswordManagerDriverFactory::PasswordManagerDriverFactory(
  85. content::WebContents* web_contents)
  86. : content::WebContentsObserver(web_contents),
  87. content::WebContentsUserData<PasswordManagerDriverFactory>(
  88. *web_contents) {}
  89. PasswordManagerDriverFactory::~PasswordManagerDriverFactory() = default;
  90. // static
  91. void PasswordManagerDriverFactory::BindPasswordManagerDriver(
  92. mojo::PendingAssociatedReceiver<autofill::mojom::PasswordManagerDriver>
  93. pending_receiver,
  94. content::RenderFrameHost* render_frame_host) {
  95. // TODO(https://crbug.com/1233858): Similarly to the
  96. // ContentPasswordManagerDriver implementation. Do not bind the interface when
  97. // the RenderFrameHost is in an anonymous iframe.
  98. content::WebContents* web_contents =
  99. content::WebContents::FromRenderFrameHost(render_frame_host);
  100. if (!web_contents)
  101. return;
  102. PasswordManagerDriverFactory* factory =
  103. PasswordManagerDriverFactory::FromWebContents(web_contents);
  104. if (!factory)
  105. return;
  106. factory->GetDriverForFrame(render_frame_host)
  107. ->BindPendingReceiver(std::move(pending_receiver));
  108. }
  109. PasswordManagerDriverFactory::PasswordManagerDriver*
  110. PasswordManagerDriverFactory::GetDriverForFrame(
  111. content::RenderFrameHost* render_frame_host) {
  112. DCHECK_EQ(web_contents(),
  113. content::WebContents::FromRenderFrameHost(render_frame_host));
  114. DCHECK(render_frame_host->IsRenderFrameLive());
  115. auto [it, inserted] =
  116. frame_driver_map_.try_emplace(render_frame_host, render_frame_host);
  117. return &it->second;
  118. }
  119. void PasswordManagerDriverFactory::RenderFrameDeleted(
  120. content::RenderFrameHost* render_frame_host) {
  121. frame_driver_map_.erase(render_frame_host);
  122. }
  123. WEB_CONTENTS_USER_DATA_KEY_IMPL(PasswordManagerDriverFactory);
  124. } // namespace weblayer