Chromium Code Reviews| Index: chrome/browser/media/media_stream_capture_indicator.h |
| diff --git a/chrome/browser/media/media_stream_capture_indicator.h b/chrome/browser/media/media_stream_capture_indicator.h |
| index c94f26ffc1bde0c014fc55855ec0d8b4f684b6ad..a36faf7f8b2ccdabae2ff90e8c10ccc3ba5d10eb 100644 |
| --- a/chrome/browser/media/media_stream_capture_indicator.h |
| +++ b/chrome/browser/media/media_stream_capture_indicator.h |
| @@ -5,19 +5,23 @@ |
| #ifndef CHROME_BROWSER_MEDIA_MEDIA_STREAM_CAPTURE_INDICATOR_H_ |
| #define CHROME_BROWSER_MEDIA_MEDIA_STREAM_CAPTURE_INDICATOR_H_ |
| +#include <map> |
| #include <string> |
| +#include <utility> |
| #include <vector> |
| #include "base/memory/ref_counted.h" |
| -#include "base/memory/scoped_ptr.h" |
| #include "content/public/common/media_stream_request.h" |
| #include "ui/base/models/simple_menu_model.h" |
| -#include "ui/gfx/image/image_skia.h" |
| namespace content { |
| class WebContents; |
| } // namespace content |
| +namespace gfx { |
| +class ImageSkia; |
| +} // namespace gfx |
| + |
| class StatusIcon; |
| class StatusTray; |
| @@ -47,61 +51,19 @@ class MediaStreamCaptureIndicator |
| int render_view_id, |
| const content::MediaStreamDevices& devices); |
| - // Returns true if the render process is capturing media. |
| - bool IsProcessCapturing(int render_process_id, int render_view_id) const; |
| + // Returns true if the render view is capturing user media (e.g., webcam |
| + // or microphone input). |
| + bool IsCapturingUserMedia(int render_process_id, int render_view_id) const; |
| - // Returns true if the render process is capturing tab media. |
| - bool IsProcessCapturingTab(int render_process_id, int render_view_id) const; |
| + // Returns true if the render view itself is being mirrored (e.g., a source of |
| + // media for remote broadcast). |
| + bool IsBeingMirrored(int render_process_id, int render_view_id) const; |
| // ImageLoader callback. |
| void OnImageLoaded(const string16& message, const gfx::Image& image); |
| private: |
| - // Struct to store the usage information of the capture devices for each tab. |
| - // Note: It is not safe to dereference WebContents pointer. This is used to |
| - // track the tab after navigations as render_view_id's can change. |
| - // TODO(estade): this should be called CaptureDeviceContents; not all the |
| - // render views it represents are tabs. |
| - struct CaptureDeviceTab { |
| - CaptureDeviceTab(content::WebContents* web_contents, |
| - int render_process_id, |
| - int render_view_id) |
| - : web_contents(web_contents), |
| - render_process_id(render_process_id), |
| - render_view_id(render_view_id), |
| - audio_ref_count(0), |
| - video_ref_count(0), |
| - tab_capture_ref_count(0) {} |
| - |
| - content::WebContents* web_contents; |
| - int render_process_id; |
| - int render_view_id; |
| - int audio_ref_count; |
| - int video_ref_count; |
| - int tab_capture_ref_count; |
| - }; |
| - |
| - // A private predicate used in std::find_if to find a |CaptureDeviceTab| |
| - // which matches the information specified at construction. A tab will match |
| - // if either the web_contents pointer is the same or the render_process_id and |
| - // render_view_id's are the same. In the first case, a tab with a UI indicator |
| - // may have changed page so the id's are different. In the second case, the |
| - // web_contents may have already been destroyed before the indicator was |
| - // hidden. |
| - class TabEquals { |
| - public: |
| - TabEquals(content::WebContents* web_contents, |
| - int render_process_id, |
| - int render_view_id); |
| - |
| - bool operator() ( |
| - const MediaStreamCaptureIndicator::CaptureDeviceTab& tab); |
| - |
| - private: |
| - content::WebContents* web_contents_; |
| - int render_process_id_; |
| - int render_view_id_; |
| - }; |
| + class WebContentsDeviceUsage; |
| friend class base::RefCountedThreadSafe<MediaStreamCaptureIndicator>; |
| virtual ~MediaStreamCaptureIndicator(); |
| @@ -115,33 +77,43 @@ class MediaStreamCaptureIndicator |
| const content::MediaStreamDevices& devices); |
| // Following functions/variables are executed/accessed only on UI thread. |
| - // Creates the status tray if it has not been created. |
| - void CreateStatusTray(); |
| + |
| + // Creates and shows the status tray icon if it has not been created and is |
| + // supported on the current platform. |
| + void MaybeCreateStatusTrayIcon(); |
| // Makes sure we have done one-time initialization of the images. |
| void EnsureStatusTrayIconResources(); |
| - // Adds the new tab to the device usage list. |
| - void AddCaptureDeviceTab(int render_process_id, |
| - int render_view_id, |
| - const content::MediaStreamDevices& devices); |
| - |
| - // Removes the tab from the device usage list. |
| - void RemoveCaptureDeviceTab(int render_process_id, |
| - int render_view_id, |
| - const content::MediaStreamDevices& devices); |
| + // Finds a WebContents instance by its RenderView's current or |
| + // previously-known IDs. This is necessary since clients that called |
| + // CaptureDevicesOpened() may later call CaptureDevicesClosed() with stale |
| + // IDs. Do not attempt to dereference the pointer without first consulting |
| + // WebContentsDeviceUsage::IsWebContentsDestroyed(). |
| + content::WebContents* LookUpByKnownAlias(int render_process_id, |
| + int render_view_id) const; |
| + |
| + // Adds devices to usage map and triggers necessary UI updates. |
| + void AddCaptureDevices(int render_process_id, |
| + int render_view_id, |
| + const content::MediaStreamDevices& devices); |
| + |
| + // Removes devices from the usage map and triggers necessary UI updates. |
| + void RemoveCaptureDevices(int render_process_id, |
| + int render_view_id, |
| + const content::MediaStreamDevices& devices); |
| // Triggers a balloon in the corner telling capture devices are being used. |
| - // This function is called by AddCaptureDeviceTab(). |
| - void ShowBalloon(int render_process_id, int render_view_id, |
| - bool audio, bool video); |
| + // This function is called by AddCaptureDevices(). |
| + void ShowBalloon(content::WebContents* web_contents, |
| + int balloon_body_message_id); |
| - // Hides the status tray from the desktop. This function is called by |
| - // RemoveCaptureDeviceTab() when the device usage list becomes empty. |
| - void Hide(); |
| + // Removes the status tray icon from the desktop. This function is called by |
| + // RemoveCaptureDevices() when the device usage map becomes empty. |
| + void MaybeDestroyStatusTrayIcon(); |
| // Updates the status tray menu with the new device list. This call will be |
| - // triggered by both AddCaptureDeviceTab() and RemoveCaptureDeviceTab(). |
| + // triggered by both AddCaptureDevices() and RemoveCaptureDevices(). |
| void UpdateStatusTrayIconContextMenu(); |
| // Updates the status tray tooltip and image according to which kind of |
| @@ -158,9 +130,22 @@ class MediaStreamCaptureIndicator |
| gfx::ImageSkia* camera_image_; |
| gfx::ImageSkia* balloon_image_; |
| - // A list that contains the usage information of the opened capture devices. |
| - typedef std::vector<CaptureDeviceTab> CaptureDeviceTabs; |
| - CaptureDeviceTabs tabs_; |
| + // A map that contains the usage counts of the opened capture devices for each |
| + // WebContents instance. |
| + typedef std::map<content::WebContents*, WebContentsDeviceUsage*> UsageMap; |
|
justinlin
2013/01/29 21:32:07
would it be possible to make this a map of objects
miu
2013/01/29 21:41:41
I would have liked to do this, but WebContentsDevi
|
| + UsageMap usage_map_; |
| + |
| + // A map of previously-known render_process_id/render_view_id pairs that have |
| + // been associated with a WebContents instance. |
| + typedef std::pair<int, int> RenderViewIDs; |
| + typedef std::map<RenderViewIDs, content::WebContents*> AliasMap; |
| + AliasMap aliases_; |
| + |
| + // A vector which maps command IDs to their associated WebContents |
| + // instance. This is rebuilt each time the status tray icon context menu is |
| + // updated. |
| + typedef std::vector<content::WebContents*> CommandTargets; |
| + CommandTargets command_targets_; |
| bool should_show_balloon_; |
| }; |