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