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