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