Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1004)

Side by Side Diff: chrome/browser/media/public_session_media_access_handler.cc

Issue 2697833004: Revert of Public Sessions - prompt the user for pageCapture requests (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/media/public_session_media_access_handler.h" 5 #include "chrome/browser/media/public_session_media_access_handler.h"
6 6
7 #include <set>
8 #include <utility> 7 #include <utility>
9 8
10 #include "base/bind.h" 9 #include "base/bind.h"
11 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
12 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
13 #include "chrome/browser/chromeos/extensions/public_session_permission_helper.h"
14 #include "chrome/browser/profiles/profiles_state.h"
15 #include "chromeos/login/login_state.h" 12 #include "chromeos/login/login_state.h"
16 #include "content/public/browser/web_contents.h" 13 #include "content/public/browser/web_contents.h"
17 #include "extensions/common/extension.h" 14 #include "extensions/common/extension.h"
18 #include "extensions/common/permissions/manifest_permission_set.h" 15 #include "extensions/common/permissions/manifest_permission_set.h"
19 #include "extensions/common/permissions/permission_set.h" 16 #include "extensions/common/permissions/permission_set.h"
20 #include "extensions/common/url_pattern_set.h" 17 #include "extensions/common/url_pattern_set.h"
21 18
19 namespace {
20
21 // Returns true if we're in a Public Session.
22 bool IsPublicSession() {
23 return chromeos::LoginState::IsInitialized() &&
24 chromeos::LoginState::Get()->IsPublicSessionUser();
25 }
26
27 } // namespace
28
22 PublicSessionMediaAccessHandler::PublicSessionMediaAccessHandler() {} 29 PublicSessionMediaAccessHandler::PublicSessionMediaAccessHandler() {}
23 30
24 PublicSessionMediaAccessHandler::~PublicSessionMediaAccessHandler() {} 31 PublicSessionMediaAccessHandler::~PublicSessionMediaAccessHandler() {}
25 32
26 bool PublicSessionMediaAccessHandler::SupportsStreamType( 33 bool PublicSessionMediaAccessHandler::SupportsStreamType(
27 const content::MediaStreamType type, 34 const content::MediaStreamType type,
28 const extensions::Extension* extension) { 35 const extensions::Extension* extension) {
29 return extension_media_access_handler_.SupportsStreamType(type, extension); 36 return extension_media_access_handler_.SupportsStreamType(type, extension);
30 } 37 }
31 38
32 bool PublicSessionMediaAccessHandler::CheckMediaAccessPermission( 39 bool PublicSessionMediaAccessHandler::CheckMediaAccessPermission(
33 content::WebContents* web_contents, 40 content::WebContents* web_contents,
34 const GURL& security_origin, 41 const GURL& security_origin,
35 content::MediaStreamType type, 42 content::MediaStreamType type,
36 const extensions::Extension* extension) { 43 const extensions::Extension* extension) {
37 return extension_media_access_handler_.CheckMediaAccessPermission( 44 return extension_media_access_handler_.CheckMediaAccessPermission(
38 web_contents, security_origin, type, extension); 45 web_contents, security_origin, type, extension);
39 } 46 }
40 47
41 void PublicSessionMediaAccessHandler::HandleRequest( 48 void PublicSessionMediaAccessHandler::HandleRequest(
42 content::WebContents* web_contents, 49 content::WebContents* web_contents,
43 const content::MediaStreamRequest& request, 50 const content::MediaStreamRequest& request,
44 const content::MediaResponseCallback& callback, 51 const content::MediaResponseCallback& callback,
45 const extensions::Extension* extension) { 52 const extensions::Extension* extension) {
46 // This class handles requests for Public Sessions only, outside of them just 53 // This class handles requests for Public Sessions only, outside of them just
47 // pass the request through to the original class. 54 // pass the request through to the original class.
48 if (!profiles::IsPublicSession() || !extension->is_platform_app()) { 55 if (!IsPublicSession() || !extension->is_platform_app()) {
49 return extension_media_access_handler_.HandleRequest(web_contents, request, 56 return extension_media_access_handler_.HandleRequest(web_contents, request,
50 callback, extension); 57 callback, extension);
51 } 58 }
52 59
53 // This Unretained is safe because the lifetime of this object is until 60 bool needs_prompt = false;
54 // process exit (living inside a base::Singleton object). 61 extensions::APIPermissionSet new_apis;
55 auto prompt_resolved_callback = base::Bind( 62 UserChoice& user_choice = user_choice_cache_[extension->id()];
56 &PublicSessionMediaAccessHandler::ChainHandleRequest,
57 base::Unretained(this), web_contents, request, callback, extension);
58 63
59 extensions::PermissionIDSet requested_permissions; 64 if (user_choice.NeedsPrompting(request.audio_type)) {
60 if (request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE) 65 new_apis.insert(extensions::APIPermission::kAudioCapture);
61 requested_permissions.insert(extensions::APIPermission::kAudioCapture); 66 user_choice.SetPrompted(content::MEDIA_DEVICE_AUDIO_CAPTURE);
62 if (request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE) 67 needs_prompt = true;
63 requested_permissions.insert(extensions::APIPermission::kVideoCapture); 68 }
69 if (user_choice.NeedsPrompting(request.video_type)) {
70 new_apis.insert(extensions::APIPermission::kVideoCapture);
71 user_choice.SetPrompted(content::MEDIA_DEVICE_VIDEO_CAPTURE);
72 needs_prompt = true;
73 }
64 74
65 extensions::permission_helper::HandlePermissionRequest( 75 if (!needs_prompt)
66 *extension, requested_permissions, web_contents, prompt_resolved_callback, 76 return ChainHandleRequest(web_contents, request, callback, extension);
67 extensions::permission_helper::PromptFactory()); 77
78 auto permission_set = base::MakeUnique<extensions::PermissionSet>(
79 new_apis, extensions::ManifestPermissionSet(),
80 extensions::URLPatternSet(), extensions::URLPatternSet());
81
82 auto prompt = base::MakeUnique<ExtensionInstallPrompt>(web_contents);
83
84 prompt->ShowDialog(
85 base::Bind(&PublicSessionMediaAccessHandler::ResolvePermissionPrompt,
86 base::Unretained(this), web_contents, request, callback,
87 extension),
88 extension,
89 nullptr, // Uses the extension icon.
90 base::MakeUnique<ExtensionInstallPrompt::Prompt>(
91 ExtensionInstallPrompt::PERMISSIONS_PROMPT),
92 std::move(permission_set),
93 ExtensionInstallPrompt::GetDefaultShowDialogCallback());
94
95 extension_install_prompt_map_[extension->id()] = std::move(prompt);
68 } 96 }
69 97
70 void PublicSessionMediaAccessHandler::ChainHandleRequest( 98 void PublicSessionMediaAccessHandler::ChainHandleRequest(
71 content::WebContents* web_contents, 99 content::WebContents* web_contents,
72 const content::MediaStreamRequest& request, 100 const content::MediaStreamRequest& request,
73 const content::MediaResponseCallback& callback, 101 const content::MediaResponseCallback& callback,
74 const extensions::Extension* extension, 102 const extensions::Extension* extension) {
75 const extensions::PermissionIDSet& allowed_permissions) { 103 DCHECK(IsPublicSession() && extension && extension->is_platform_app());
104 const UserChoice& user_choice = user_choice_cache_[extension->id()];
76 content::MediaStreamRequest request_copy(request); 105 content::MediaStreamRequest request_copy(request);
77 106
78 // If the user denies audio or video capture, here it gets filtered out from 107 // If the user denies audio or video capture, here it gets filtered out from
79 // the request before being passed on to the actual implementation. 108 // the request before being passed on to the actual implementation.
80 if (!allowed_permissions.ContainsID(extensions::APIPermission::kAudioCapture)) 109 if (!user_choice.IsAllowed(content::MEDIA_DEVICE_AUDIO_CAPTURE))
81 request_copy.audio_type = content::MEDIA_NO_SERVICE; 110 request_copy.audio_type = content::MEDIA_NO_SERVICE;
82 if (!allowed_permissions.ContainsID(extensions::APIPermission::kVideoCapture)) 111 if (!user_choice.IsAllowed(content::MEDIA_DEVICE_VIDEO_CAPTURE))
83 request_copy.video_type = content::MEDIA_NO_SERVICE; 112 request_copy.video_type = content::MEDIA_NO_SERVICE;
84 113
85 // Pass the request through to the original class. 114 // Pass the request through to the original class.
86 extension_media_access_handler_.HandleRequest(web_contents, request_copy, 115 extension_media_access_handler_.HandleRequest(web_contents, request_copy,
87 callback, extension); 116 callback, extension);
88 } 117 }
118
119 void PublicSessionMediaAccessHandler::ResolvePermissionPrompt(
120 content::WebContents* web_contents,
121 const content::MediaStreamRequest& request,
122 const content::MediaResponseCallback& callback,
123 const extensions::Extension* extension,
124 ExtensionInstallPrompt::Result prompt_result) {
125 // Dispose of the prompt as it's not needed anymore.
126 extension_install_prompt_map_.erase(extension->id());
127
128 bool allowed = prompt_result == ExtensionInstallPrompt::Result::ACCEPTED;
129 UserChoice& user_choice = user_choice_cache_[extension->id()];
130
131 if (request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE)
132 user_choice.Set(content::MEDIA_DEVICE_AUDIO_CAPTURE, allowed);
133 if (request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE)
134 user_choice.Set(content::MEDIA_DEVICE_VIDEO_CAPTURE, allowed);
135
136 ChainHandleRequest(web_contents, request, callback, extension);
137 }
138
139 bool PublicSessionMediaAccessHandler::UserChoice::IsAllowed(
140 content::MediaStreamType type) const {
141 switch (type) {
142 case content::MEDIA_DEVICE_AUDIO_CAPTURE:
143 return !audio_prompted_ || audio_allowed_;
144 case content::MEDIA_DEVICE_VIDEO_CAPTURE:
145 return !video_prompted_ || video_allowed_;
146 default:
147 NOTREACHED();
148 return false;
149 }
150 }
151
152 bool PublicSessionMediaAccessHandler::UserChoice::NeedsPrompting(
153 content::MediaStreamType type) const {
154 switch (type) {
155 case content::MEDIA_DEVICE_AUDIO_CAPTURE:
156 return !audio_prompted_;
157 case content::MEDIA_DEVICE_VIDEO_CAPTURE:
158 return !video_prompted_;
159 default:
160 return false;
161 }
162 }
163
164 void PublicSessionMediaAccessHandler::UserChoice::Set(
165 content::MediaStreamType type,
166 bool allowed) {
167 switch (type) {
168 case content::MEDIA_DEVICE_AUDIO_CAPTURE:
169 audio_allowed_ = allowed;
170 break;
171 case content::MEDIA_DEVICE_VIDEO_CAPTURE:
172 video_allowed_ = allowed;
173 break;
174 default:
175 NOTREACHED();
176 }
177 }
178
179 void PublicSessionMediaAccessHandler::UserChoice::SetPrompted(
180 content::MediaStreamType type) {
181 switch (type) {
182 case content::MEDIA_DEVICE_AUDIO_CAPTURE:
183 audio_prompted_ = true;
184 break;
185 case content::MEDIA_DEVICE_VIDEO_CAPTURE:
186 video_prompted_ = true;
187 break;
188 default:
189 NOTREACHED();
190 }
191 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698