electron_web_contents_utility_handler_impl.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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::DoGetZoomLevel(
  51. DoGetZoomLevelCallback callback) {
  52. api::WebContents* api_web_contents = api::WebContents::From(web_contents());
  53. if (api_web_contents) {
  54. api_web_contents->DoGetZoomLevel(std::move(callback));
  55. }
  56. }
  57. void ElectronWebContentsUtilityHandlerImpl::CanAccessClipboardDeprecated(
  58. mojom::PermissionName name,
  59. const blink::LocalFrameToken& frame_token,
  60. CanAccessClipboardDeprecatedCallback callback) {
  61. if (render_frame_host_token_.frame_token == frame_token) {
  62. // Paste requires either (1) user activation, ...
  63. if (web_contents()->HasRecentInteraction()) {
  64. std::move(callback).Run(blink::mojom::PermissionStatus::GRANTED);
  65. return;
  66. }
  67. // (2) granted permission, ...
  68. content::RenderFrameHost* render_frame_host = GetRenderFrameHost();
  69. content::BrowserContext* browser_context =
  70. render_frame_host->GetBrowserContext();
  71. content::PermissionController* permission_controller =
  72. browser_context->GetPermissionController();
  73. blink::PermissionType permission;
  74. if (name == mojom::PermissionName::DEPRECATED_SYNC_CLIPBOARD_READ) {
  75. permission = blink::PermissionType::DEPRECATED_SYNC_CLIPBOARD_READ;
  76. } else {
  77. std::move(callback).Run(blink::mojom::PermissionStatus::DENIED);
  78. return;
  79. }
  80. blink::mojom::PermissionStatus status =
  81. permission_controller->GetPermissionStatusForCurrentDocument(
  82. permission, render_frame_host);
  83. std::move(callback).Run(status);
  84. } else {
  85. std::move(callback).Run(blink::mojom::PermissionStatus::DENIED);
  86. }
  87. }
  88. content::RenderFrameHost*
  89. ElectronWebContentsUtilityHandlerImpl::GetRenderFrameHost() {
  90. return content::RenderFrameHost::FromFrameToken(render_frame_host_token_);
  91. }
  92. // static
  93. void ElectronWebContentsUtilityHandlerImpl::Create(
  94. content::RenderFrameHost* frame_host,
  95. mojo::PendingAssociatedReceiver<mojom::ElectronWebContentsUtility>
  96. receiver) {
  97. new ElectronWebContentsUtilityHandlerImpl(frame_host, std::move(receiver));
  98. }
  99. } // namespace electron