Home | History | Annotate | Download | only in desktop_capture
      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:
     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