electron_web_contents_utility_handler_impl.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // Copyright (c) 2022 Slack Technologies, 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_web_contents_utility_handler_impl.h"
  5. #include <utility>
  6. #include "content/public/browser/browser_context.h"
  7. #include "content/public/browser/permission_controller.h"
  8. #include "content/public/browser/render_frame_host.h"
  9. #include "content/public/browser/render_process_host.h"
  10. #include "mojo/public/cpp/bindings/self_owned_receiver.h"
  11. #include "shell/browser/web_contents_permission_helper.h"
  12. #include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
  13. namespace electron {
  14. ElectronWebContentsUtilityHandlerImpl::ElectronWebContentsUtilityHandlerImpl(
  15. content::RenderFrameHost* frame_host,
  16. mojo::PendingAssociatedReceiver<mojom::ElectronWebContentsUtility> receiver)
  17. : render_frame_host_token_(frame_host->GetGlobalFrameToken()) {
  18. content::WebContents* web_contents =
  19. content::WebContents::FromRenderFrameHost(frame_host);
  20. DCHECK(web_contents);
  21. content::WebContentsObserver::Observe(web_contents);
  22. receiver_.Bind(std::move(receiver));
  23. receiver_.set_disconnect_handler(base::BindOnce(
  24. &ElectronWebContentsUtilityHandlerImpl::OnConnectionError, GetWeakPtr()));
  25. }
  26. ElectronWebContentsUtilityHandlerImpl::
  27. ~ElectronWebContentsUtilityHandlerImpl() = default;
  28. void ElectronWebContentsUtilityHandlerImpl::RenderFrameDeleted(
  29. content::RenderFrameHost* render_frame_host) {
  30. if (render_frame_host->GetGlobalFrameToken() == render_frame_host_token_) {
  31. delete this;
  32. }
  33. }
  34. void ElectronWebContentsUtilityHandlerImpl::OnConnectionError() {
  35. delete this;
  36. }
  37. void ElectronWebContentsUtilityHandlerImpl::OnFirstNonEmptyLayout() {
  38. api::WebContents* api_web_contents = api::WebContents::From(web_contents());
  39. if (api_web_contents) {
  40. api_web_contents->OnFirstNonEmptyLayout(GetRenderFrameHost());
  41. }
  42. }
  43. void ElectronWebContentsUtilityHandlerImpl::SetTemporaryZoomLevel(
  44. double level) {
  45. api::WebContents* api_web_contents = api::WebContents::From(web_contents());
  46. if (api_web_contents) {
  47. api_web_contents->SetTemporaryZoomLevel(level);
  48. }
  49. }
  50. void ElectronWebContentsUtilityHandlerImpl::CanAccessClipboardDeprecated(
  51. mojom::PermissionName name,
  52. const blink::LocalFrameToken& frame_token,
  53. CanAccessClipboardDeprecatedCallback callback) {
  54. if (render_frame_host_token_.frame_token == frame_token) {
  55. // Paste requires either (1) user activation, ...
  56. if (web_contents()->HasRecentInteraction()) {
  57. std::move(callback).Run(blink::mojom::PermissionStatus::GRANTED);
  58. return;
  59. }
  60. // (2) granted permission, ...
  61. content::RenderFrameHost* render_frame_host = GetRenderFrameHost();
  62. content::BrowserContext* browser_context =
  63. render_frame_host->GetBrowserContext();
  64. content::PermissionController* permission_controller =
  65. browser_context->GetPermissionController();
  66. blink::PermissionType permission;
  67. if (name == mojom::PermissionName::DEPRECATED_SYNC_CLIPBOARD_READ) {
  68. permission = blink::PermissionType::DEPRECATED_SYNC_CLIPBOARD_READ;
  69. } else {
  70. std::move(callback).Run(blink::mojom::PermissionStatus::DENIED);
  71. return;
  72. }
  73. blink::mojom::PermissionStatus status =
  74. permission_controller->GetPermissionStatusForCurrentDocument(
  75. permission, render_frame_host);
  76. std::move(callback).Run(status);
  77. } else {
  78. std::move(callback).Run(blink::mojom::PermissionStatus::DENIED);
  79. }
  80. }
  81. content::RenderFrameHost*
  82. ElectronWebContentsUtilityHandlerImpl::GetRenderFrameHost() {
  83. return content::RenderFrameHost::FromFrameToken(render_frame_host_token_);
  84. }
  85. // static
  86. void ElectronWebContentsUtilityHandlerImpl::Create(
  87. content::RenderFrameHost* frame_host,
  88. mojo::PendingAssociatedReceiver<mojom::ElectronWebContentsUtility>
  89. receiver) {
  90. new ElectronWebContentsUtilityHandlerImpl(frame_host, std::move(receiver));
  91. }
  92. } // namespace electron