web_engine_permission_delegate.cc 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // Copyright 2019 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 "fuchsia_web/webengine/browser/web_engine_permission_delegate.h"
  5. #include <utility>
  6. #include "base/callback.h"
  7. #include "base/check_op.h"
  8. #include "base/notreached.h"
  9. #include "components/permissions/permission_util.h"
  10. #include "content/public/browser/permission_controller.h"
  11. #include "fuchsia_web/webengine/browser/frame_impl.h"
  12. #include "third_party/blink/public/common/permissions/permission_utils.h"
  13. #include "url/origin.h"
  14. WebEnginePermissionDelegate::WebEnginePermissionDelegate() = default;
  15. WebEnginePermissionDelegate::~WebEnginePermissionDelegate() = default;
  16. void WebEnginePermissionDelegate::RequestPermission(
  17. blink::PermissionType permission,
  18. content::RenderFrameHost* render_frame_host,
  19. const GURL& origin,
  20. bool user_gesture,
  21. base::OnceCallback<void(blink::mojom::PermissionStatus)> callback) {
  22. std::vector<blink::PermissionType> permissions{permission};
  23. RequestPermissions(
  24. permissions, render_frame_host, origin, user_gesture,
  25. base::BindOnce(
  26. [](base::OnceCallback<void(blink::mojom::PermissionStatus)> callback,
  27. const std::vector<blink::mojom::PermissionStatus>& state) {
  28. DCHECK_EQ(state.size(), 1U);
  29. std::move(callback).Run(state[0]);
  30. },
  31. std::move(callback)));
  32. }
  33. void WebEnginePermissionDelegate::RequestPermissions(
  34. const std::vector<blink::PermissionType>& permissions,
  35. content::RenderFrameHost* render_frame_host,
  36. const GURL& requesting_origin,
  37. bool user_gesture,
  38. base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)>
  39. callback) {
  40. FrameImpl* frame = FrameImpl::FromRenderFrameHost(render_frame_host);
  41. DCHECK(frame);
  42. frame->permission_controller()->RequestPermissions(
  43. permissions, url::Origin::Create(requesting_origin), user_gesture,
  44. std::move(callback));
  45. }
  46. void WebEnginePermissionDelegate::ResetPermission(
  47. blink::PermissionType permission,
  48. const GURL& requesting_origin,
  49. const GURL& embedding_origin) {
  50. // TODO(crbug.com/1063094): Implement when the PermissionManager protocol is
  51. // defined and implemented.
  52. NOTIMPLEMENTED() << ": " << static_cast<int>(permission);
  53. }
  54. void WebEnginePermissionDelegate::RequestPermissionsFromCurrentDocument(
  55. const std::vector<blink::PermissionType>& permissions,
  56. content::RenderFrameHost* render_frame_host,
  57. bool user_gesture,
  58. base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)>
  59. callback) {
  60. std::vector<std::string> permission_strings;
  61. permission_strings.reserve(permissions.size());
  62. for (const auto& permission : permissions) {
  63. permission_strings.push_back(
  64. permissions::PermissionUtil::GetPermissionString(
  65. permissions::PermissionUtil::PermissionTypeToContentSettingType(
  66. permission)));
  67. }
  68. // TODO(crbug.com/1063094): Clean up this warning once the permission
  69. // API is implemented.
  70. LOG(WARNING) << "Denied permissions that were not previously granted by "
  71. << "SetPermissionState: "
  72. << base::JoinString(permission_strings, ", ");
  73. FrameImpl* frame = FrameImpl::FromRenderFrameHost(render_frame_host);
  74. DCHECK(frame);
  75. frame->permission_controller()->RequestPermissions(
  76. permissions, render_frame_host->GetLastCommittedOrigin(), user_gesture,
  77. std::move(callback));
  78. }
  79. blink::mojom::PermissionStatus WebEnginePermissionDelegate::GetPermissionStatus(
  80. blink::PermissionType permission,
  81. const GURL& requesting_origin,
  82. const GURL& embedding_origin) {
  83. // Although GetPermissionStatusForCurrentDocument() should be used for most
  84. // permissions, some use cases (e.g., BACKGROUND_SYNC) do not have a frame.
  85. //
  86. // TODO(crbug.com/1063094): Handle frame-less permission status checks in the
  87. // PermissionManager API. Until then, reject such requests.
  88. return blink::mojom::PermissionStatus::DENIED;
  89. }
  90. content::PermissionResult
  91. WebEnginePermissionDelegate::GetPermissionResultForOriginWithoutContext(
  92. blink::PermissionType permission,
  93. const url::Origin& origin) {
  94. blink::mojom::PermissionStatus status =
  95. GetPermissionStatus(permission, origin.GetURL(), origin.GetURL());
  96. return content::PermissionResult(
  97. status, content::PermissionStatusSource::UNSPECIFIED);
  98. }
  99. blink::mojom::PermissionStatus
  100. WebEnginePermissionDelegate::GetPermissionStatusForCurrentDocument(
  101. blink::PermissionType permission,
  102. content::RenderFrameHost* render_frame_host) {
  103. FrameImpl* frame = FrameImpl::FromRenderFrameHost(render_frame_host);
  104. DCHECK(frame);
  105. return frame->permission_controller()->GetPermissionState(
  106. permission, render_frame_host->GetLastCommittedOrigin());
  107. }
  108. blink::mojom::PermissionStatus
  109. WebEnginePermissionDelegate::GetPermissionStatusForWorker(
  110. blink::PermissionType permission,
  111. content::RenderProcessHost* render_process_host,
  112. const GURL& worker_origin) {
  113. // Use |worker_origin| for requesting_origin and embedding_origin because
  114. // workers don't have embedders.
  115. return GetPermissionStatus(permission, worker_origin, worker_origin);
  116. }
  117. WebEnginePermissionDelegate::SubscriptionId
  118. WebEnginePermissionDelegate::SubscribePermissionStatusChange(
  119. blink::PermissionType permission,
  120. content::RenderProcessHost* render_process_host,
  121. content::RenderFrameHost* render_frame_host,
  122. const GURL& requesting_origin,
  123. base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) {
  124. // TODO(crbug.com/1063094): Implement permission status subscription. It's
  125. // used in blink to emit PermissionStatus.onchange notifications.
  126. NOTIMPLEMENTED_LOG_ONCE() << ": " << static_cast<int>(permission);
  127. return SubscriptionId();
  128. }
  129. void WebEnginePermissionDelegate::UnsubscribePermissionStatusChange(
  130. SubscriptionId subscription_id) {
  131. // TODO(crbug.com/1063094): Implement permission status subscription. It's
  132. // used in blink to emit PermissionStatus.onchange notifications.
  133. NOTIMPLEMENTED_LOG_ONCE();
  134. }