13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_DESKTOP_CAPTURE_DESKTOP_CAPTURE_API_H_
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_DESKTOP_CAPTURE_DESKTOP_CAPTURE_API_H_
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <map>
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/singleton.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/chrome_extension_function.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/media/desktop_media_list.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/media/desktop_media_picker.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/media/native_desktop_media_list.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/extensions/api/desktop_capture.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "url/gurl.h"
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace extensions {
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class DesktopCaptureChooseDesktopMediaFunction
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public ChromeAsyncExtensionFunction,
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      public content::WebContentsObserver {
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("desktopCapture.chooseDesktopMedia",
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             DESKTOPCAPTURE_CHOOSEDESKTOPMEDIA)
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Factory creating DesktopMediaList and DesktopMediaPicker instances.
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Used for tests to supply fake picker.
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  class PickerFactory {
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)   public:
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    virtual scoped_ptr<DesktopMediaList> CreateModel(bool show_screens,
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                     bool show_windows) = 0;
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    virtual scoped_ptr<DesktopMediaPicker> CreatePicker() = 0;
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)   protected:
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    virtual ~PickerFactory() {}
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Used to set PickerFactory used to create mock DesktopMediaPicker instances
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // for tests. Calling tests keep ownership of the factory. Can be called with
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // |factory| set to NULL at the end of the test.
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static void SetPickerFactoryForTests(PickerFactory* factory);
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DesktopCaptureChooseDesktopMediaFunction();
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void Cancel();
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~DesktopCaptureChooseDesktopMediaFunction();
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // ExtensionFunction overrides.
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool RunAsync() OVERRIDE;
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // content::WebContentsObserver overrides.
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void WebContentsDestroyed() OVERRIDE;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void OnPickerDialogResults(content::DesktopMediaID source);
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int request_id_;
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // URL of page that desktop capture was requested for.
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GURL origin_;
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<DesktopMediaPicker> picker_;
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DesktopCaptureCancelChooseDesktopMediaFunction
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : public ChromeSyncExtensionFunction {
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("desktopCapture.cancelChooseDesktopMedia",
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                             DESKTOPCAPTURE_CANCELCHOOSEDESKTOPMEDIA)
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DesktopCaptureCancelChooseDesktopMediaFunction();
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~DesktopCaptureCancelChooseDesktopMediaFunction();
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // ExtensionFunction overrides.
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual bool RunSync() OVERRIDE;
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DesktopCaptureRequestsRegistry {
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DesktopCaptureRequestsRegistry();
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ~DesktopCaptureRequestsRegistry();
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static DesktopCaptureRequestsRegistry* GetInstance();
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void AddRequest(int process_id,
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  int request_id,
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  DesktopCaptureChooseDesktopMediaFunction* handler);
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void RemoveRequest(int process_id, int request_id);
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void CancelRequest(int process_id, int request_id);
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  friend struct DefaultSingletonTraits<DesktopCaptureRequestsRegistry>;
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct RequestId {
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    RequestId(int process_id, int request_id);
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Need to use RequestId as a key in std::map<>.
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool operator<(const RequestId& other) const;
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int process_id;
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int request_id;
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  typedef std::map<RequestId,
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   DesktopCaptureChooseDesktopMediaFunction*> RequestsMap;
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RequestsMap requests_;
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DesktopCaptureRequestsRegistry);
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace extensions
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_DESKTOP_CAPTURE_DESKTOP_CAPTURE_API_H_
119