• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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_EXTENSIONS_API_DESKTOP_CAPTURE_DESKTOP_CAPTURE_API_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_DESKTOP_CAPTURE_DESKTOP_CAPTURE_API_H_
7 
8 #include <map>
9 
10 #include "base/memory/singleton.h"
11 #include "chrome/browser/extensions/chrome_extension_function.h"
12 #include "chrome/browser/media/desktop_media_list.h"
13 #include "chrome/browser/media/desktop_media_picker.h"
14 #include "chrome/browser/media/native_desktop_media_list.h"
15 #include "chrome/common/extensions/api/desktop_capture.h"
16 #include "content/public/browser/web_contents_observer.h"
17 #include "url/gurl.h"
18 
19 namespace extensions {
20 
21 class DesktopCaptureChooseDesktopMediaFunction
22     : public ChromeAsyncExtensionFunction,
23       public content::WebContentsObserver {
24  public:
25   DECLARE_EXTENSION_FUNCTION("desktopCapture.chooseDesktopMedia",
26                              DESKTOPCAPTURE_CHOOSEDESKTOPMEDIA)
27 
28   // Factory creating DesktopMediaList and DesktopMediaPicker instances.
29   // Used for tests to supply fake picker.
30   class PickerFactory {
31    public:
32     virtual scoped_ptr<DesktopMediaList> CreateModel(bool show_screens,
33                                                      bool show_windows) = 0;
34     virtual scoped_ptr<DesktopMediaPicker> CreatePicker() = 0;
35    protected:
~PickerFactory()36     virtual ~PickerFactory() {}
37   };
38 
39   // Used to set PickerFactory used to create mock DesktopMediaPicker instances
40   // for tests. Calling tests keep ownership of the factory. Can be called with
41   // |factory| set to NULL at the end of the test.
42   static void SetPickerFactoryForTests(PickerFactory* factory);
43 
44   DesktopCaptureChooseDesktopMediaFunction();
45 
46   void Cancel();
47 
48  private:
49   virtual ~DesktopCaptureChooseDesktopMediaFunction();
50 
51   // ExtensionFunction overrides.
52   virtual bool RunAsync() OVERRIDE;
53 
54   // content::WebContentsObserver overrides.
55   virtual void WebContentsDestroyed() OVERRIDE;
56 
57   void OnPickerDialogResults(content::DesktopMediaID source);
58 
59   int request_id_;
60 
61   // Parameters of the tab the stream is requested for.
62   int render_process_id_;
63   int render_view_id_;
64   GURL origin_;
65 
66   scoped_ptr<DesktopMediaPicker> picker_;
67 };
68 
69 class DesktopCaptureCancelChooseDesktopMediaFunction
70     : public ChromeSyncExtensionFunction {
71  public:
72   DECLARE_EXTENSION_FUNCTION("desktopCapture.cancelChooseDesktopMedia",
73                              DESKTOPCAPTURE_CANCELCHOOSEDESKTOPMEDIA)
74 
75   DesktopCaptureCancelChooseDesktopMediaFunction();
76 
77  private:
78   virtual ~DesktopCaptureCancelChooseDesktopMediaFunction();
79 
80   // ExtensionFunction overrides.
81   virtual bool RunSync() OVERRIDE;
82 };
83 
84 class DesktopCaptureRequestsRegistry {
85  public:
86   DesktopCaptureRequestsRegistry();
87   ~DesktopCaptureRequestsRegistry();
88 
89   static DesktopCaptureRequestsRegistry* GetInstance();
90 
91   void AddRequest(int process_id,
92                   int request_id,
93                   DesktopCaptureChooseDesktopMediaFunction* handler);
94   void RemoveRequest(int process_id, int request_id);
95   void CancelRequest(int process_id, int request_id);
96 
97  private:
98   friend struct DefaultSingletonTraits<DesktopCaptureRequestsRegistry>;
99 
100   struct RequestId {
101     RequestId(int process_id, int request_id);
102 
103     // Need to use RequestId as a key in std::map<>.
104     bool operator<(const RequestId& other) const;
105 
106     int process_id;
107     int request_id;
108   };
109 
110   typedef std::map<RequestId,
111                    DesktopCaptureChooseDesktopMediaFunction*> RequestsMap;
112 
113   RequestsMap requests_;
114 
115   DISALLOW_COPY_AND_ASSIGN(DesktopCaptureRequestsRegistry);
116 };
117 
118 }  // namespace extensions
119 
120 #endif  // CHROME_BROWSER_EXTENSIONS_API_DESKTOP_CAPTURE_DESKTOP_CAPTURE_API_H_
121