1 // Copyright 2018 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_DISPLAY_MEDIA_ACCESS_HANDLER_H_ 6 #define CHROME_BROWSER_MEDIA_WEBRTC_DISPLAY_MEDIA_ACCESS_HANDLER_H_ 7 8 #include <memory> 9 #include <string> 10 11 #include "base/containers/flat_map.h" 12 #include "base/macros.h" 13 #include "chrome/browser/media/capture_access_handler_base.h" 14 #include "chrome/browser/media/media_access_handler.h" 15 #include "chrome/browser/media/webrtc/desktop_media_list.h" 16 #include "chrome/browser/media/webrtc/desktop_media_picker.h" 17 #include "chrome/browser/media/webrtc/desktop_media_picker_factory.h" 18 #include "content/public/browser/desktop_media_id.h" 19 #include "content/public/browser/notification_observer.h" 20 #include "content/public/browser/notification_registrar.h" 21 22 namespace extensions { 23 class Extension; 24 } 25 26 // MediaAccessHandler for getDisplayMedia API, see 27 // https://w3c.github.io/mediacapture-screen-share. 28 class DisplayMediaAccessHandler : public CaptureAccessHandlerBase, 29 public content::NotificationObserver { 30 public: 31 DisplayMediaAccessHandler(); 32 DisplayMediaAccessHandler( 33 std::unique_ptr<DesktopMediaPickerFactory> picker_factory, 34 bool display_notification); 35 ~DisplayMediaAccessHandler() override; 36 37 // MediaAccessHandler implementation. 38 bool SupportsStreamType(content::WebContents* web_contents, 39 const blink::mojom::MediaStreamType stream_type, 40 const extensions::Extension* extension) override; 41 bool CheckMediaAccessPermission( 42 content::RenderFrameHost* render_frame_host, 43 const GURL& security_origin, 44 blink::mojom::MediaStreamType type, 45 const extensions::Extension* extension) override; 46 void HandleRequest(content::WebContents* web_contents, 47 const content::MediaStreamRequest& request, 48 content::MediaResponseCallback callback, 49 const extensions::Extension* extension) override; 50 void UpdateMediaRequestState(int render_process_id, 51 int render_frame_id, 52 int page_request_id, 53 blink::mojom::MediaStreamType stream_type, 54 content::MediaRequestState state) override; 55 56 private: 57 friend class DisplayMediaAccessHandlerTest; 58 59 struct PendingAccessRequest; 60 using RequestsQueue = 61 base::circular_deque<std::unique_ptr<PendingAccessRequest>>; 62 using RequestsQueues = base::flat_map<content::WebContents*, RequestsQueue>; 63 64 void ProcessQueuedAccessRequest(const RequestsQueue& queue, 65 content::WebContents* web_contents); 66 67 void OnPickerDialogResults(content::WebContents* web_contents, 68 content::DesktopMediaID source); 69 70 void AddNotificationObserver(); 71 72 // content::NotificationObserver implementation. 73 void Observe(int type, 74 const content::NotificationSource& source, 75 const content::NotificationDetails& details) override; 76 77 void DeletePendingAccessRequest(int render_process_id, 78 int render_frame_id, 79 int page_request_id); 80 81 bool display_notification_ = true; 82 std::unique_ptr<DesktopMediaPickerFactory> picker_factory_; 83 RequestsQueues pending_requests_; 84 content::NotificationRegistrar notifications_registrar_; 85 86 DISALLOW_COPY_AND_ASSIGN(DisplayMediaAccessHandler); 87 }; 88 89 #endif // CHROME_BROWSER_MEDIA_WEBRTC_DISPLAY_MEDIA_ACCESS_HANDLER_H_ 90