1 // Copyright 2015 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 5 #ifndef CHROME_BROWSER_MEDIA_WEBRTC_PERMISSION_BUBBLE_MEDIA_ACCESS_HANDLER_H_ 6 #define CHROME_BROWSER_MEDIA_WEBRTC_PERMISSION_BUBBLE_MEDIA_ACCESS_HANDLER_H_ 7 8 #include <map> 9 10 #include "base/memory/weak_ptr.h" 11 #include "chrome/browser/media/media_access_handler.h" 12 #include "components/content_settings/core/common/content_settings.h" 13 #include "content/public/browser/notification_observer.h" 14 #include "content/public/browser/notification_registrar.h" 15 #include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h" 16 17 namespace user_prefs { 18 class PrefRegistrySyncable; 19 } 20 21 // MediaAccessHandler for permission bubble requests. 22 class PermissionBubbleMediaAccessHandler 23 : public MediaAccessHandler, 24 public content::NotificationObserver { 25 public: 26 PermissionBubbleMediaAccessHandler(); 27 ~PermissionBubbleMediaAccessHandler() override; 28 29 // MediaAccessHandler implementation. 30 bool SupportsStreamType(content::WebContents* web_contents, 31 const blink::mojom::MediaStreamType type, 32 const extensions::Extension* extension) override; 33 bool CheckMediaAccessPermission( 34 content::RenderFrameHost* render_frame_host, 35 const GURL& security_origin, 36 blink::mojom::MediaStreamType type, 37 const extensions::Extension* extension) override; 38 void HandleRequest(content::WebContents* web_contents, 39 const content::MediaStreamRequest& request, 40 content::MediaResponseCallback callback, 41 const extensions::Extension* extension) override; 42 void UpdateMediaRequestState(int render_process_id, 43 int render_frame_id, 44 int page_request_id, 45 blink::mojom::MediaStreamType stream_type, 46 content::MediaRequestState state) override; 47 48 // Registers the prefs backing the audio and video policies. 49 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 50 51 private: 52 struct PendingAccessRequest; 53 using RequestsMap = std::map<int, PendingAccessRequest>; 54 using RequestsMaps = std::map<content::WebContents*, RequestsMap>; 55 56 void ProcessQueuedAccessRequest(content::WebContents* web_contents); 57 void OnMediaStreamRequestResponse( 58 content::WebContents* web_contents, 59 int request_id, 60 content::MediaStreamRequest request, 61 const blink::MediaStreamDevices& devices, 62 blink::mojom::MediaStreamRequestResult result, 63 bool blocked_by_feature_policy, 64 ContentSetting audio_setting, 65 ContentSetting video_setting); 66 void OnAccessRequestResponse(content::WebContents* web_contents, 67 int request_id, 68 const blink::MediaStreamDevices& devices, 69 blink::mojom::MediaStreamRequestResult result, 70 std::unique_ptr<content::MediaStreamUI> ui); 71 72 // content::NotificationObserver implementation. 73 void Observe(int type, 74 const content::NotificationSource& source, 75 const content::NotificationDetails& details) override; 76 77 int next_request_id_ = 0; 78 RequestsMaps pending_requests_; 79 content::NotificationRegistrar notifications_registrar_; 80 81 base::WeakPtrFactory<PermissionBubbleMediaAccessHandler> weak_factory_{this}; 82 }; 83 84 #endif // CHROME_BROWSER_MEDIA_WEBRTC_PERMISSION_BUBBLE_MEDIA_ACCESS_HANDLER_H_ 85