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
19namespace extensions {
20
21class 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:
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  // URL of page that desktop capture was requested for.
62  GURL origin_;
63
64  scoped_ptr<DesktopMediaPicker> picker_;
65};
66
67class DesktopCaptureCancelChooseDesktopMediaFunction
68    : public ChromeSyncExtensionFunction {
69 public:
70  DECLARE_EXTENSION_FUNCTION("desktopCapture.cancelChooseDesktopMedia",
71                             DESKTOPCAPTURE_CANCELCHOOSEDESKTOPMEDIA)
72
73  DesktopCaptureCancelChooseDesktopMediaFunction();
74
75 private:
76  virtual ~DesktopCaptureCancelChooseDesktopMediaFunction();
77
78  // ExtensionFunction overrides.
79  virtual bool RunSync() OVERRIDE;
80};
81
82class DesktopCaptureRequestsRegistry {
83 public:
84  DesktopCaptureRequestsRegistry();
85  ~DesktopCaptureRequestsRegistry();
86
87  static DesktopCaptureRequestsRegistry* GetInstance();
88
89  void AddRequest(int process_id,
90                  int request_id,
91                  DesktopCaptureChooseDesktopMediaFunction* handler);
92  void RemoveRequest(int process_id, int request_id);
93  void CancelRequest(int process_id, int request_id);
94
95 private:
96  friend struct DefaultSingletonTraits<DesktopCaptureRequestsRegistry>;
97
98  struct RequestId {
99    RequestId(int process_id, int request_id);
100
101    // Need to use RequestId as a key in std::map<>.
102    bool operator<(const RequestId& other) const;
103
104    int process_id;
105    int request_id;
106  };
107
108  typedef std::map<RequestId,
109                   DesktopCaptureChooseDesktopMediaFunction*> RequestsMap;
110
111  RequestsMap requests_;
112
113  DISALLOW_COPY_AND_ASSIGN(DesktopCaptureRequestsRegistry);
114};
115
116}  // namespace extensions
117
118#endif  // CHROME_BROWSER_EXTENSIONS_API_DESKTOP_CAPTURE_DESKTOP_CAPTURE_API_H_
119