electron_autofill_driver.cc 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright (c) 2019 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #include "shell/browser/electron_autofill_driver.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "content/public/browser/render_widget_host_view.h"
  8. #include "shell/browser/api/electron_api_web_contents.h"
  9. #include "shell/browser/javascript_environment.h"
  10. #include "shell/browser/native_window.h"
  11. namespace electron {
  12. AutofillDriver::AutofillDriver(content::RenderFrameHost* render_frame_host)
  13. : render_frame_host_(render_frame_host) {
  14. autofill_popup_ = std::make_unique<AutofillPopup>();
  15. }
  16. AutofillDriver::~AutofillDriver() = default;
  17. void AutofillDriver::BindPendingReceiver(
  18. mojo::PendingAssociatedReceiver<mojom::ElectronAutofillDriver>
  19. pending_receiver) {
  20. receiver_.Bind(std::move(pending_receiver));
  21. }
  22. void AutofillDriver::ShowAutofillPopup(
  23. const gfx::RectF& bounds,
  24. const std::vector<std::u16string>& values,
  25. const std::vector<std::u16string>& labels) {
  26. v8::Isolate* isolate = JavascriptEnvironment::GetIsolate();
  27. v8::HandleScope scope(isolate);
  28. auto* web_contents = api::WebContents::From(
  29. content::WebContents::FromRenderFrameHost(render_frame_host_));
  30. if (!web_contents)
  31. return;
  32. auto* owner_window = web_contents->owner_window();
  33. if (!owner_window)
  34. return;
  35. auto* embedder = web_contents->embedder();
  36. bool osr =
  37. web_contents->IsOffScreen() || (embedder && embedder->IsOffScreen());
  38. gfx::RectF popup_bounds(bounds);
  39. content::RenderFrameHost* embedder_frame_host = nullptr;
  40. if (embedder) {
  41. auto* embedder_view =
  42. embedder->web_contents()->GetPrimaryMainFrame()->GetView();
  43. auto* view = web_contents->web_contents()->GetPrimaryMainFrame()->GetView();
  44. auto offset = view->GetViewBounds().origin() -
  45. embedder_view->GetViewBounds().origin();
  46. popup_bounds.Offset(offset);
  47. embedder_frame_host = embedder->web_contents()->GetPrimaryMainFrame();
  48. }
  49. autofill_popup_->CreateView(render_frame_host_, embedder_frame_host, osr,
  50. owner_window->content_view(), popup_bounds);
  51. autofill_popup_->SetItems(values, labels);
  52. }
  53. void AutofillDriver::HideAutofillPopup() {
  54. if (autofill_popup_)
  55. autofill_popup_->Hide();
  56. }
  57. } // namespace electron