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   // URL of page that desktop capture was requested for.
     62   GURL origin_;
     63 
     64   scoped_ptr<DesktopMediaPicker> picker_;
     65 };
     66 
     67 class 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 
     82 class 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