• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_MEDIA_MEDIA_STREAM_DEVICES_CONTROLLER_H_
6 #define CHROME_BROWSER_MEDIA_MEDIA_STREAM_DEVICES_CONTROLLER_H_
7 
8 #include <map>
9 #include <string>
10 
11 #include "chrome/browser/ui/website_settings/permission_bubble_request.h"
12 #include "content/public/browser/web_contents_delegate.h"
13 
14 class Profile;
15 class TabSpecificContentSettings;
16 
17 namespace content {
18 class WebContents;
19 }
20 
21 namespace user_prefs {
22 class PrefRegistrySyncable;
23 }
24 
25 class MediaStreamDevicesController : public PermissionBubbleRequest {
26  public:
27   // Permissions for media stream types.
28   enum Permission {
29     MEDIA_NONE,
30     MEDIA_ALLOWED,
31     MEDIA_BLOCKED_BY_POLICY,
32     MEDIA_BLOCKED_BY_USER_SETTING,
33     MEDIA_BLOCKED_BY_USER,
34   };
35 
36   struct MediaStreamTypeSettings {
37     MediaStreamTypeSettings(Permission permission,
38                             const std::string& requested_device_id);
39     MediaStreamTypeSettings();
40     ~MediaStreamTypeSettings();
41 
42     Permission permission;
43     std::string requested_device_id;
44   };
45 
46   typedef std::map<content::MediaStreamType, MediaStreamTypeSettings>
47       MediaStreamTypeSettingsMap;
48 
49   MediaStreamDevicesController(content::WebContents* web_contents,
50                                const content::MediaStreamRequest& request,
51                                const content::MediaResponseCallback& callback);
52 
53   virtual ~MediaStreamDevicesController();
54 
55   // TODO(tommi): Clean up all the policy code and integrate with
56   // HostContentSettingsMap instead.  This will make creating the UI simpler
57   // and the code cleaner.  crbug.com/244389.
58 
59   // Registers the prefs backing the audio and video policies.
60   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
61 
62   // Public method to be called before creating the MediaStreamInfoBarDelegate.
63   // This function will check the content settings exceptions and take the
64   // corresponding action on exception which matches the request.
65   bool DismissInfoBarAndTakeActionOnSettings();
66 
67   // Public methods to be called by MediaStreamInfoBarDelegate;
68   bool HasAudio() const;
69   bool HasVideo() const;
70   const std::string& GetSecurityOriginSpec() const;
71   void Accept(bool update_content_setting);
72   void Deny(bool update_content_setting,
73             content::MediaStreamRequestResult result);
74 
75   // PermissionBubbleRequest:
76   virtual int GetIconID() const OVERRIDE;
77   virtual base::string16 GetMessageText() const OVERRIDE;
78   virtual base::string16 GetMessageTextFragment() const OVERRIDE;
79   virtual bool HasUserGesture() const OVERRIDE;
80   virtual GURL GetRequestingHostname() const OVERRIDE;
81   virtual void PermissionGranted() OVERRIDE;
82   virtual void PermissionDenied() OVERRIDE;
83   virtual void Cancelled() OVERRIDE;
84   virtual void RequestFinished() OVERRIDE;
85 
86  private:
87   enum DevicePolicy {
88     POLICY_NOT_SET,
89     ALWAYS_DENY,
90     ALWAYS_ALLOW,
91   };
92 
93   // Called by GetAudioDevicePolicy and GetVideoDevicePolicy to check
94   // the currently set capture device policy.
95   DevicePolicy GetDevicePolicy(const char* policy_name,
96                                const char* whitelist_policy_name) const;
97 
98   // Returns true if the origin of the request has been granted the media
99   // access before, otherwise returns false.
100   bool IsRequestAllowedByDefault() const;
101 
102   // Check if any device of the request has been blocked for the origin of the
103   // request and clears |microphone_requested_| or |webcam_requested_| flags if
104   // they are not allowed anymore. Returns the number of devices that are
105   // allowed after this step. If the count reaches zero the request can be
106   // denied completely, else it still has to be partially fullfilled.
107   int FilterBlockedByDefaultDevices();
108 
109   // Returns true if the media section in content settings is set to
110   // |CONTENT_SETTING_BLOCK|, otherwise returns false.
111   bool IsDefaultMediaAccessBlocked() const;
112 
113   // Returns true if the origin is a secure scheme, otherwise returns false.
114   bool IsSchemeSecure() const;
115 
116   // Returns true if request's origin is from internal objects like
117   // chrome://URLs, otherwise returns false.
118   bool ShouldAlwaysAllowOrigin() const;
119 
120   // Sets the permission of the origin of the request. This is triggered when
121   // the users deny the request or allow the request for https sites.
122   void SetPermission(bool allowed) const;
123 
124   // Notifies the content setting UI that the media stream access request or
125   // part of the request is accepted.
126   void NotifyUIRequestAccepted() const;
127 
128   // Notifies the content setting UI that the media stream access request or
129   // part of the request is denied.
130   void NotifyUIRequestDenied();
131 
132   // Return true if the type has been requested and permission is currently set
133   // to allowed. Note that it does not reflect the final permission decision.
134   // This function is called during the filtering steps to check if the type has
135   // been blocked yet or not and the permission may be changed to blocked during
136   // these filterings. See also the initialization in the constructor and
137   // comments on that.
138   bool IsDeviceAudioCaptureRequestedAndAllowed() const;
139   bool IsDeviceVideoCaptureRequestedAndAllowed() const;
140 
141   // Returns true if media capture device is allowed to be used. This could
142   // return false when tab goes to background.
143   bool IsCaptureDeviceRequestAllowed() const;
144 
145   content::WebContents* web_contents_;
146 
147   // The owner of this class needs to make sure it does not outlive the profile.
148   Profile* profile_;
149 
150   // Weak pointer to the tab specific content settings of the tab for which the
151   // MediaStreamDevicesController was created. The tab specific content
152   // settings are associated with a the web contents of the tab. The
153   // MediaStreamDeviceController must not outlive the web contents for which it
154   // was created.
155   TabSpecificContentSettings* content_settings_;
156 
157   // The original request for access to devices.
158   const content::MediaStreamRequest request_;
159 
160   // The callback that needs to be Run to notify WebRTC of whether access to
161   // audio/video devices was granted or not.
162   content::MediaResponseCallback callback_;
163 
164   // Holds the requested media types and the permission for each type. It is
165   // passed to the tab specific content settings when the permissions have been
166   // resolved. Currently only used by MEDIA_DEVICE_AUDIO_CAPTURE and
167   // MEDIA_DEVICE_VIDEO_CAPTURE since those are the only types that require
168   // updates in the settings.
169   MediaStreamTypeSettingsMap request_permissions_;
170 
171   DISALLOW_COPY_AND_ASSIGN(MediaStreamDevicesController);
172 };
173 
174 #endif  // CHROME_BROWSER_MEDIA_MEDIA_STREAM_DEVICES_CONTROLLER_H_
175