atom_permission_manager.cc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // Copyright (c) 2016 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 "atom/browser/atom_permission_manager.h"
  5. #include <vector>
  6. #include "atom/browser/web_contents_preferences.h"
  7. #include "content/public/browser/child_process_security_policy.h"
  8. #include "content/public/browser/permission_type.h"
  9. #include "content/public/browser/render_frame_host.h"
  10. #include "content/public/browser/render_process_host.h"
  11. #include "content/public/browser/render_view_host.h"
  12. #include "content/public/browser/web_contents.h"
  13. namespace atom {
  14. namespace {
  15. bool WebContentsDestroyed(int process_id) {
  16. auto contents =
  17. WebContentsPreferences::GetWebContentsFromProcessID(process_id);
  18. if (!contents)
  19. return true;
  20. return contents->IsBeingDestroyed();
  21. }
  22. } // namespace
  23. AtomPermissionManager::AtomPermissionManager()
  24. : request_id_(0) {
  25. }
  26. AtomPermissionManager::~AtomPermissionManager() {
  27. }
  28. void AtomPermissionManager::SetPermissionRequestHandler(
  29. const RequestHandler& handler) {
  30. if (handler.is_null() && !pending_requests_.empty()) {
  31. for (const auto& request : pending_requests_) {
  32. if (!WebContentsDestroyed(request.second.render_process_id))
  33. request.second.callback.Run(blink::mojom::PermissionStatus::DENIED);
  34. }
  35. pending_requests_.clear();
  36. }
  37. request_handler_ = handler;
  38. }
  39. int AtomPermissionManager::RequestPermission(
  40. content::PermissionType permission,
  41. content::RenderFrameHost* render_frame_host,
  42. const GURL& requesting_origin,
  43. const ResponseCallback& response_callback) {
  44. int process_id = render_frame_host->GetProcess()->GetID();
  45. if (permission == content::PermissionType::MIDI_SYSEX) {
  46. content::ChildProcessSecurityPolicy::GetInstance()->
  47. GrantSendMidiSysExMessage(process_id);
  48. }
  49. if (!request_handler_.is_null()) {
  50. auto web_contents =
  51. content::WebContents::FromRenderFrameHost(render_frame_host);
  52. ++request_id_;
  53. auto callback = base::Bind(&AtomPermissionManager::OnPermissionResponse,
  54. base::Unretained(this),
  55. request_id_,
  56. requesting_origin,
  57. response_callback);
  58. pending_requests_[request_id_] = { process_id, callback };
  59. request_handler_.Run(web_contents, permission, callback);
  60. return request_id_;
  61. }
  62. response_callback.Run(blink::mojom::PermissionStatus::GRANTED);
  63. return kNoPendingOperation;
  64. }
  65. int AtomPermissionManager::RequestPermissions(
  66. const std::vector<content::PermissionType>& permissions,
  67. content::RenderFrameHost* render_frame_host,
  68. const GURL& requesting_origin,
  69. const base::Callback<void(
  70. const std::vector<blink::mojom::PermissionStatus>&)>& callback) {
  71. // FIXME(zcbenz): Just ignore multiple permissions request for now.
  72. std::vector<blink::mojom::PermissionStatus> permissionStatuses;
  73. for (auto permission : permissions) {
  74. if (permission == content::PermissionType::MIDI_SYSEX) {
  75. content::ChildProcessSecurityPolicy::GetInstance()->
  76. GrantSendMidiSysExMessage(render_frame_host->GetProcess()->GetID());
  77. }
  78. permissionStatuses.push_back(blink::mojom::PermissionStatus::GRANTED);
  79. }
  80. callback.Run(permissionStatuses);
  81. return kNoPendingOperation;
  82. }
  83. void AtomPermissionManager::OnPermissionResponse(
  84. int request_id,
  85. const GURL& origin,
  86. const ResponseCallback& callback,
  87. blink::mojom::PermissionStatus status) {
  88. auto request = pending_requests_.find(request_id);
  89. if (request != pending_requests_.end()) {
  90. if (!WebContentsDestroyed(request->second.render_process_id))
  91. callback.Run(status);
  92. pending_requests_.erase(request);
  93. }
  94. }
  95. void AtomPermissionManager::CancelPermissionRequest(int request_id) {
  96. auto request = pending_requests_.find(request_id);
  97. if (request != pending_requests_.end()) {
  98. if (!WebContentsDestroyed(request->second.render_process_id))
  99. request->second.callback.Run(blink::mojom::PermissionStatus::DENIED);
  100. pending_requests_.erase(request);
  101. }
  102. }
  103. void AtomPermissionManager::ResetPermission(
  104. content::PermissionType permission,
  105. const GURL& requesting_origin,
  106. const GURL& embedding_origin) {
  107. }
  108. blink::mojom::PermissionStatus AtomPermissionManager::GetPermissionStatus(
  109. content::PermissionType permission,
  110. const GURL& requesting_origin,
  111. const GURL& embedding_origin) {
  112. return blink::mojom::PermissionStatus::GRANTED;
  113. }
  114. void AtomPermissionManager::RegisterPermissionUsage(
  115. content::PermissionType permission,
  116. const GURL& requesting_origin,
  117. const GURL& embedding_origin) {
  118. }
  119. int AtomPermissionManager::SubscribePermissionStatusChange(
  120. content::PermissionType permission,
  121. const GURL& requesting_origin,
  122. const GURL& embedding_origin,
  123. const ResponseCallback& callback) {
  124. return -1;
  125. }
  126. void AtomPermissionManager::UnsubscribePermissionStatusChange(
  127. int subscription_id) {
  128. }
  129. } // namespace atom