1 // Copyright (c) 2012 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_TAB_CAPTURE_TAB_CAPTURE_REGISTRY_H_ 6 #define CHROME_BROWSER_EXTENSIONS_API_TAB_CAPTURE_TAB_CAPTURE_REGISTRY_H_ 7 8 #include <string> 9 #include <utility> 10 #include <vector> 11 12 #include "base/memory/scoped_vector.h" 13 #include "base/scoped_observer.h" 14 #include "chrome/browser/media/media_capture_devices_dispatcher.h" 15 #include "chrome/common/extensions/api/tab_capture.h" 16 #include "content/public/browser/media_request_state.h" 17 #include "content/public/browser/notification_observer.h" 18 #include "content/public/browser/notification_registrar.h" 19 #include "extensions/browser/browser_context_keyed_api_factory.h" 20 #include "extensions/browser/extension_registry_observer.h" 21 22 namespace content { 23 class BrowserContext; 24 } 25 26 namespace extensions { 27 28 struct TabCaptureRequest; 29 class ExtensionRegistry; 30 class FullscreenObserver; 31 32 namespace tab_capture = api::tab_capture; 33 34 class TabCaptureRegistry : public BrowserContextKeyedAPI, 35 public content::NotificationObserver, 36 public ExtensionRegistryObserver, 37 public MediaCaptureDevicesDispatcher::Observer { 38 public: 39 typedef std::vector<std::pair<int, tab_capture::TabCaptureState> > 40 RegistryCaptureInfo; 41 42 static TabCaptureRegistry* Get(content::BrowserContext* context); 43 44 // Used by BrowserContextKeyedAPI. 45 static BrowserContextKeyedAPIFactory<TabCaptureRegistry>* 46 GetFactoryInstance(); 47 48 // List all pending, active and stopped capture requests. 49 const RegistryCaptureInfo GetCapturedTabs( 50 const std::string& extension_id) const; 51 52 // Add a tab capture request to the registry when a stream is requested 53 // through the API. 54 bool AddRequest(int render_process_id, 55 int render_view_id, 56 const std::string& extension_id, 57 int tab_id, 58 tab_capture::TabCaptureState status); 59 60 // The MediaStreamDevicesController will verify the request before creating 61 // the stream by checking the registry here. 62 bool VerifyRequest(int render_process_id, int render_view_id); 63 64 private: 65 friend class BrowserContextKeyedAPIFactory<TabCaptureRegistry>; 66 friend class FullscreenObserver; 67 68 explicit TabCaptureRegistry(content::BrowserContext* context); 69 virtual ~TabCaptureRegistry(); 70 71 // Used by BrowserContextKeyedAPI. service_name()72 static const char* service_name() { 73 return "TabCaptureRegistry"; 74 } 75 76 static const bool kServiceIsCreatedWithBrowserContext = false; 77 static const bool kServiceRedirectedInIncognito = true; 78 79 // content::NotificationObserver implementation. 80 virtual void Observe(int type, 81 const content::NotificationSource& source, 82 const content::NotificationDetails& details) OVERRIDE; 83 84 // ExtensionRegistryObserver implementation. 85 virtual void OnExtensionUnloaded( 86 content::BrowserContext* browser_context, 87 const Extension* extension, 88 UnloadedExtensionInfo::Reason reason) OVERRIDE; 89 90 // MediaCaptureDevicesDispatcher::Observer implementation. 91 virtual void OnRequestUpdate( 92 int render_process_id, 93 int render_view_id, 94 const content::MediaStreamDevice& device, 95 const content::MediaRequestState state) OVERRIDE; 96 97 void DispatchStatusChangeEvent(const TabCaptureRequest* request) const; 98 99 TabCaptureRequest* FindCaptureRequest(int render_process_id, 100 int render_view_id) const; 101 102 void DeleteCaptureRequest(int render_process_id, int render_view_id); 103 104 content::NotificationRegistrar registrar_; 105 content::BrowserContext* const browser_context_; 106 ScopedVector<TabCaptureRequest> requests_; 107 108 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 109 extension_registry_observer_; 110 111 DISALLOW_COPY_AND_ASSIGN(TabCaptureRegistry); 112 }; 113 114 } // namespace extensions 115 116 #endif // CHROME_BROWSER_EXTENSIONS_API_TAB_CAPTURE_TAB_CAPTURE_REGISTRY_H_ 117