| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | // Copyright (c) 2016 GitHub, Inc.
 | 
					
						
							|  |  |  | // Use of this source code is governed by the MIT license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "atom/browser/web_contents_permission_helper.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-13 11:57:23 +10:00
										 |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2018-09-13 11:57:23 +10:00
										 |  |  | #include <utility>
 | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-30 16:49:18 +05:30
										 |  |  | #include "atom/browser/atom_permission_manager.h"
 | 
					
						
							| 
									
										
										
										
											2018-10-19 20:51:43 +02:00
										 |  |  | #include "atom/browser/media/media_stream_devices_controller.h"
 | 
					
						
							| 
									
										
										
										
											2017-11-11 14:27:30 +11:00
										 |  |  | #include "atom/common/native_mate_converters/gurl_converter.h"
 | 
					
						
							| 
									
										
										
										
											2016-02-01 00:43:29 +05:30
										 |  |  | #include "content/public/browser/browser_context.h"
 | 
					
						
							| 
									
										
										
										
											2016-01-30 16:49:18 +05:30
										 |  |  | #include "content/public/browser/render_process_host.h"
 | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-29 02:05:08 +12:00
										 |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-21 21:58:04 +05:30
										 |  |  | std::string MediaStreamTypeToString(blink::MediaStreamType type) { | 
					
						
							| 
									
										
										
										
											2018-08-29 02:05:08 +12:00
										 |  |  |   switch (type) { | 
					
						
							| 
									
										
										
										
											2019-01-21 21:58:04 +05:30
										 |  |  |     case blink::MediaStreamType::MEDIA_DEVICE_AUDIO_CAPTURE: | 
					
						
							| 
									
										
										
										
											2018-08-29 02:05:08 +12:00
										 |  |  |       return "audio"; | 
					
						
							| 
									
										
										
										
											2019-01-21 21:58:04 +05:30
										 |  |  |     case blink::MediaStreamType::MEDIA_DEVICE_VIDEO_CAPTURE: | 
					
						
							| 
									
										
										
										
											2018-08-29 02:05:08 +12:00
										 |  |  |       return "video"; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       return "unknown"; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | namespace atom { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | void MediaAccessAllowed(const content::MediaStreamRequest& request, | 
					
						
							| 
									
										
										
										
											2018-10-02 11:09:25 -07:00
										 |  |  |                         content::MediaResponseCallback callback, | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |                         bool allowed) { | 
					
						
							| 
									
										
										
										
											2018-10-19 20:51:43 +02:00
										 |  |  |   MediaStreamDevicesController controller(request, std::move(callback)); | 
					
						
							| 
									
										
										
										
											2016-02-01 17:45:53 +05:30
										 |  |  |   if (allowed) | 
					
						
							| 
									
										
										
										
											2016-02-12 05:07:06 +05:30
										 |  |  |     controller.TakeAction(); | 
					
						
							| 
									
										
										
										
											2016-02-01 17:45:53 +05:30
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2019-01-21 21:58:04 +05:30
										 |  |  |     controller.Deny(blink::MEDIA_DEVICE_PERMISSION_DENIED); | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 15:13:49 +05:30
										 |  |  | void OnPointerLockResponse(content::WebContents* web_contents, bool allowed) { | 
					
						
							|  |  |  |   if (web_contents) | 
					
						
							|  |  |  |     web_contents->GotResponseToLockMouseRequest(allowed); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-29 13:02:15 -07:00
										 |  |  | void OnPermissionResponse(base::OnceCallback<void(bool)> callback, | 
					
						
							| 
									
										
										
										
											2016-05-23 12:28:59 +09:00
										 |  |  |                           blink::mojom::PermissionStatus status) { | 
					
						
							|  |  |  |   if (status == blink::mojom::PermissionStatus::GRANTED) | 
					
						
							| 
									
										
										
										
											2019-05-29 13:02:15 -07:00
										 |  |  |     std::move(callback).Run(true); | 
					
						
							| 
									
										
										
										
											2016-02-01 03:05:34 +05:30
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2019-05-29 13:02:15 -07:00
										 |  |  |     std::move(callback).Run(false); | 
					
						
							| 
									
										
										
										
											2016-02-01 03:05:34 +05:30
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | }  // namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WebContentsPermissionHelper::WebContentsPermissionHelper( | 
					
						
							| 
									
										
										
										
											2016-01-30 16:49:18 +05:30
										 |  |  |     content::WebContents* web_contents) | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |     : web_contents_(web_contents) {} | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | WebContentsPermissionHelper::~WebContentsPermissionHelper() {} | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-30 16:49:18 +05:30
										 |  |  | void WebContentsPermissionHelper::RequestPermission( | 
					
						
							| 
									
										
										
										
											2017-11-11 14:27:30 +11:00
										 |  |  |     content::PermissionType permission, | 
					
						
							| 
									
										
										
										
											2019-05-29 13:02:15 -07:00
										 |  |  |     base::OnceCallback<void(bool)> callback, | 
					
						
							| 
									
										
										
										
											2017-11-11 14:27:30 +11:00
										 |  |  |     bool user_gesture, | 
					
						
							|  |  |  |     const base::DictionaryValue* details) { | 
					
						
							| 
									
										
										
										
											2018-04-17 15:41:47 -07:00
										 |  |  |   auto* rfh = web_contents_->GetMainFrame(); | 
					
						
							|  |  |  |   auto* permission_manager = static_cast<AtomPermissionManager*>( | 
					
						
							| 
									
										
										
										
											2018-10-02 14:53:10 -07:00
										 |  |  |       web_contents_->GetBrowserContext()->GetPermissionControllerDelegate()); | 
					
						
							| 
									
										
										
										
											2016-01-30 16:49:18 +05:30
										 |  |  |   auto origin = web_contents_->GetLastCommittedURL(); | 
					
						
							| 
									
										
										
										
											2017-11-11 14:27:30 +11:00
										 |  |  |   permission_manager->RequestPermissionWithDetails( | 
					
						
							| 
									
										
										
										
											2017-12-20 10:25:31 +09:00
										 |  |  |       permission, rfh, origin, false, details, | 
					
						
							| 
									
										
										
										
											2019-05-29 13:02:15 -07:00
										 |  |  |       base::BindOnce(&OnPermissionResponse, std::move(callback))); | 
					
						
							| 
									
										
										
										
											2016-01-30 16:49:18 +05:30
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-29 02:05:08 +12:00
										 |  |  | bool WebContentsPermissionHelper::CheckPermission( | 
					
						
							|  |  |  |     content::PermissionType permission, | 
					
						
							|  |  |  |     const base::DictionaryValue* details) const { | 
					
						
							|  |  |  |   auto* rfh = web_contents_->GetMainFrame(); | 
					
						
							|  |  |  |   auto* permission_manager = static_cast<AtomPermissionManager*>( | 
					
						
							| 
									
										
										
										
											2018-10-02 14:53:10 -07:00
										 |  |  |       web_contents_->GetBrowserContext()->GetPermissionControllerDelegate()); | 
					
						
							| 
									
										
										
										
											2018-08-29 02:05:08 +12:00
										 |  |  |   auto origin = web_contents_->GetLastCommittedURL(); | 
					
						
							|  |  |  |   return permission_manager->CheckPermissionWithDetails(permission, rfh, origin, | 
					
						
							|  |  |  |                                                         details); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 15:33:38 +05:30
										 |  |  | void WebContentsPermissionHelper::RequestFullscreenPermission( | 
					
						
							| 
									
										
										
										
											2019-05-29 13:02:15 -07:00
										 |  |  |     base::OnceCallback<void(bool)> callback) { | 
					
						
							| 
									
										
										
										
											2017-03-31 20:09:13 +02:00
										 |  |  |   RequestPermission( | 
					
						
							|  |  |  |       static_cast<content::PermissionType>(PermissionType::FULLSCREEN), | 
					
						
							| 
									
										
										
										
											2019-05-29 13:02:15 -07:00
										 |  |  |       std::move(callback)); | 
					
						
							| 
									
										
										
										
											2016-02-01 15:33:38 +05:30
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | void WebContentsPermissionHelper::RequestMediaAccessPermission( | 
					
						
							|  |  |  |     const content::MediaStreamRequest& request, | 
					
						
							| 
									
										
										
										
											2018-10-02 11:09:25 -07:00
										 |  |  |     content::MediaResponseCallback response_callback) { | 
					
						
							|  |  |  |   auto callback = base::AdaptCallbackForRepeating(base::BindOnce( | 
					
						
							|  |  |  |       &MediaAccessAllowed, request, std::move(response_callback))); | 
					
						
							| 
									
										
										
										
											2018-09-13 11:57:23 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |   base::DictionaryValue details; | 
					
						
							|  |  |  |   std::unique_ptr<base::ListValue> media_types(new base::ListValue); | 
					
						
							| 
									
										
										
										
											2018-09-19 13:10:26 +02:00
										 |  |  |   if (request.audio_type == | 
					
						
							| 
									
										
										
										
											2019-01-21 21:58:04 +05:30
										 |  |  |       blink::MediaStreamType::MEDIA_DEVICE_AUDIO_CAPTURE) { | 
					
						
							| 
									
										
										
										
											2018-09-13 11:57:23 +10:00
										 |  |  |     media_types->AppendString("audio"); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-09-19 13:10:26 +02:00
										 |  |  |   if (request.video_type == | 
					
						
							| 
									
										
										
										
											2019-01-21 21:58:04 +05:30
										 |  |  |       blink::MediaStreamType::MEDIA_DEVICE_VIDEO_CAPTURE) { | 
					
						
							| 
									
										
										
										
											2018-09-13 11:57:23 +10:00
										 |  |  |     media_types->AppendString("video"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   details.SetList("mediaTypes", std::move(media_types)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 03:05:34 +05:30
										 |  |  |   // The permission type doesn't matter here, AUDIO_CAPTURE/VIDEO_CAPTURE
 | 
					
						
							|  |  |  |   // are presented as same type in content_converter.h.
 | 
					
						
							| 
									
										
										
										
											2018-10-02 11:09:25 -07:00
										 |  |  |   RequestPermission(content::PermissionType::AUDIO_CAPTURE, std::move(callback), | 
					
						
							|  |  |  |                     false, &details); | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebContentsPermissionHelper::RequestWebNotificationPermission( | 
					
						
							| 
									
										
										
										
											2019-05-29 13:02:15 -07:00
										 |  |  |     base::OnceCallback<void(bool)> callback) { | 
					
						
							|  |  |  |   RequestPermission(content::PermissionType::NOTIFICATIONS, | 
					
						
							|  |  |  |                     std::move(callback)); | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-01 15:13:49 +05:30
										 |  |  | void WebContentsPermissionHelper::RequestPointerLockPermission( | 
					
						
							|  |  |  |     bool user_gesture) { | 
					
						
							| 
									
										
										
										
											2017-03-31 20:09:13 +02:00
										 |  |  |   RequestPermission( | 
					
						
							|  |  |  |       static_cast<content::PermissionType>(PermissionType::POINTER_LOCK), | 
					
						
							| 
									
										
										
										
											2019-05-29 13:02:15 -07:00
										 |  |  |       base::BindOnce(&OnPointerLockResponse, web_contents_), user_gesture); | 
					
						
							| 
									
										
										
										
											2016-02-01 15:13:49 +05:30
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-20 22:25:15 +05:30
										 |  |  | void WebContentsPermissionHelper::RequestOpenExternalPermission( | 
					
						
							| 
									
										
										
										
											2019-05-29 13:02:15 -07:00
										 |  |  |     base::OnceCallback<void(bool)> callback, | 
					
						
							| 
									
										
										
										
											2017-11-11 14:27:30 +11:00
										 |  |  |     bool user_gesture, | 
					
						
							|  |  |  |     const GURL& url) { | 
					
						
							|  |  |  |   base::DictionaryValue details; | 
					
						
							| 
									
										
										
										
											2017-12-20 10:25:31 +09:00
										 |  |  |   details.SetString("externalURL", url.spec()); | 
					
						
							| 
									
										
										
										
											2017-12-20 10:49:49 +09:00
										 |  |  |   RequestPermission( | 
					
						
							| 
									
										
										
										
											2017-03-31 20:09:13 +02:00
										 |  |  |       static_cast<content::PermissionType>(PermissionType::OPEN_EXTERNAL), | 
					
						
							| 
									
										
										
										
											2019-05-29 13:02:15 -07:00
										 |  |  |       std::move(callback), user_gesture, &details); | 
					
						
							| 
									
										
										
										
											2016-04-20 22:25:15 +05:30
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-29 02:05:08 +12:00
										 |  |  | bool WebContentsPermissionHelper::CheckMediaAccessPermission( | 
					
						
							|  |  |  |     const GURL& security_origin, | 
					
						
							| 
									
										
										
										
											2019-01-21 21:58:04 +05:30
										 |  |  |     blink::MediaStreamType type) const { | 
					
						
							| 
									
										
										
										
											2018-08-29 02:05:08 +12:00
										 |  |  |   base::DictionaryValue details; | 
					
						
							|  |  |  |   details.SetString("securityOrigin", security_origin.spec()); | 
					
						
							|  |  |  |   details.SetString("mediaType", MediaStreamTypeToString(type)); | 
					
						
							|  |  |  |   // The permission type doesn't matter here, AUDIO_CAPTURE/VIDEO_CAPTURE
 | 
					
						
							|  |  |  |   // are presented as same type in content_converter.h.
 | 
					
						
							|  |  |  |   return CheckPermission(content::PermissionType::AUDIO_CAPTURE, &details); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-21 22:26:54 +05:30
										 |  |  | WEB_CONTENTS_USER_DATA_KEY_IMPL(WebContentsPermissionHelper) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-23 18:59:47 +05:30
										 |  |  | }  // namespace atom
 |