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

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

Issue 2532323003: Public Sessions - prompt the user for audioCapture/videoCapture requests (Closed)
Patch Set: Added a new class for handling media access in Public Sessions Created 4 years 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/media/public_session_media_access_handler.h"
6
7 #include <utility>
8
9 #include "base/bind.h"
10 #include "base/bind_helpers.h"
11 #include "base/memory/ptr_util.h"
12 #include "chromeos/login/login_state.h"
13 #include "content/public/browser/web_contents.h"
14 #include "extensions/common/extension.h"
15 #include "extensions/common/permissions/manifest_permission_set.h"
16 #include "extensions/common/url_pattern_set.h"
17 #include "extensions/common/permissions/permission_set.h"
18
19 namespace {
20
21 // Returns true if we're in a Public Session.
22 bool IsPublicSession() {
23 #if defined(OS_CHROMEOS)
24 if (chromeos::LoginState::IsInitialized()) {
25 return chromeos::LoginState::Get()->IsPublicSessionUser();
26 }
27 #endif
28 return false;
29 }
30
31 } // namespace
32
33 PublicSessionMediaAccessHandler::PublicSessionMediaAccessHandler(
34 ExtensionMediaAccessHandler& extension_media_access_handler)
35 : extension_media_access_handler_(extension_media_access_handler) {
36 }
Sergey Ulanov 2016/12/01 01:21:28 'git cl format' please.
Ivan Šandrk 2016/12/01 17:32:04 Done.
37
38 PublicSessionMediaAccessHandler::~PublicSessionMediaAccessHandler() {
39 }
40
41 bool PublicSessionMediaAccessHandler::SupportsStreamType(
42 const content::MediaStreamType type,
43 const extensions::Extension* extension) {
44 if (IsPublicSession() && extension && extension->is_platform_app())
45 return extension_media_access_handler_.SupportsStreamType(type, extension);
46 return false;
47 }
48
49 bool PublicSessionMediaAccessHandler::CheckMediaAccessPermission(
50 content::WebContents* web_contents,
51 const GURL& security_origin,
52 content::MediaStreamType type,
53 const extensions::Extension* extension) {
54 return extension_media_access_handler_.CheckMediaAccessPermission(
55 web_contents, security_origin, type, extension);
56 }
57
58 void PublicSessionMediaAccessHandler::HandleRequest(
59 content::WebContents* web_contents,
60 const content::MediaStreamRequest& request,
61 const content::MediaResponseCallback& callback,
62 const extensions::Extension* extension) {
63 DCHECK(IsPublicSession() && extension && extension->is_platform_app());
64
65 bool needs_prompt = false;
66 extensions::APIPermissionSet new_apis;
67 const UserChoice& user_choice = user_choice_cache_[extension->id()];
68
69 if (user_choice.NeedsPrompting(request.audio_type)) {
70 new_apis.insert(extensions::APIPermission::kAudioCapture);
71 needs_prompt = true;
72 }
73 if (user_choice.NeedsPrompting(request.video_type)) {
74 new_apis.insert(extensions::APIPermission::kVideoCapture);
75 needs_prompt = true;
76 }
77
78 if (needs_prompt) {
79 auto permission_set = base::MakeUnique<extensions::PermissionSet>(
80 new_apis, extensions::ManifestPermissionSet(),
81 extensions::URLPatternSet(), extensions::URLPatternSet());
82
83 auto prompt = base::MakeUnique<ExtensionInstallPrompt>(web_contents);
84 prompt->ShowDialog(
85 base::Bind(&PublicSessionMediaAccessHandler::ResolvePermissionPrompt,
86 base::Unretained(this), web_contents, request, callback,
Devlin 2016/11/30 19:02:48 Why is this unretained safe?
Sergey Ulanov 2016/12/01 01:21:28 +1
Ivan Šandrk 2016/12/01 17:32:04 The lifetime of PublicSessionMediaAccessHandler is
87 extension, base::Passed(&prompt)),
Devlin 2016/11/30 19:02:48 this strikes me as a bit dangerous - we're moving
Ivan Šandrk 2016/12/01 17:32:04 Changed it a bit, good now?
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 return;
95 }
96
97 ChainHandleRequest(web_contents, request, callback, extension);
98 }
99
100 void PublicSessionMediaAccessHandler::ChainHandleRequest(
101 content::WebContents* web_contents,
102 const content::MediaStreamRequest& request,
103 const content::MediaResponseCallback& callback,
104 const extensions::Extension* extension) {
105 const UserChoice& user_choice = user_choice_cache_[extension->id()];
106 content::MediaStreamRequest request_copy(request);
107
108 if (!user_choice.IsAllowed(content::MEDIA_DEVICE_AUDIO_CAPTURE))
109 request_copy.audio_type = content::MEDIA_NO_SERVICE;
110 if (!user_choice.IsAllowed(content::MEDIA_DEVICE_VIDEO_CAPTURE))
111 request_copy.video_type = content::MEDIA_NO_SERVICE;
112
113 extension_media_access_handler_.HandleRequest(
114 web_contents, request_copy, callback, extension);
115 }
116
117
118 void PublicSessionMediaAccessHandler::ResolvePermissionPrompt(
119 content::WebContents* web_contents,
120 const content::MediaStreamRequest& request,
121 const content::MediaResponseCallback& callback,
122 const extensions::Extension* extension,
123 std::unique_ptr<ExtensionInstallPrompt> prompt,
124 ExtensionInstallPrompt::Result prompt_result) {
125 bool allowed = (prompt_result == ExtensionInstallPrompt::Result::ACCEPTED);
126 UserChoice& user_choice = user_choice_cache_[extension->id()];
127
128 if (user_choice.NeedsPrompting(request.audio_type))
129 user_choice.Set(content::MEDIA_DEVICE_AUDIO_CAPTURE, allowed);
130 if (user_choice.NeedsPrompting(request.video_type))
131 user_choice.Set(content::MEDIA_DEVICE_VIDEO_CAPTURE, allowed);
132
133 ChainHandleRequest(web_contents, request, callback, extension);
134 }
135
136 bool PublicSessionMediaAccessHandler::UserChoice::IsAllowed(
137 content::MediaStreamType type) const {
138 if (IsPublicSession()) {
139 if (type == content::MEDIA_DEVICE_AUDIO_CAPTURE) {
Devlin 2016/11/30 19:02:48 optional: These methods would be more succinct if
Ivan Šandrk 2016/12/01 17:32:04 Agreed, but it would also complicate the logic in
140 return !audio_prompted_ || audio_allowed_;
141 } else {
142 DCHECK(type == content::MEDIA_DEVICE_VIDEO_CAPTURE);
143 return !video_prompted_ || video_allowed_;
144 }
145 }
146 return false;
147 }
148
149 bool PublicSessionMediaAccessHandler::UserChoice::NeedsPrompting(
150 content::MediaStreamType type) const {
151 if (type == content::MEDIA_DEVICE_AUDIO_CAPTURE) {
152 return !audio_prompted_;
153 }
154 if (type == content::MEDIA_DEVICE_VIDEO_CAPTURE) {
155 return !video_prompted_;
156 }
157 return false;
158 }
159
160 void PublicSessionMediaAccessHandler::UserChoice::Set(
161 content::MediaStreamType type, bool allowed) {
162 if (type == content::MEDIA_DEVICE_AUDIO_CAPTURE) {
163 DCHECK(!audio_prompted_);
164 audio_prompted_ = true;
165 audio_allowed_ = allowed;
166 } else {
167 DCHECK(type == content::MEDIA_DEVICE_VIDEO_CAPTURE);
168 DCHECK(!video_prompted_);
169 video_prompted_ = true;
170 video_allowed_ = allowed;
171 }
172 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698