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