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

Side by Side Diff: content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc

Issue 795703003: Don't auto allow access to media devices unless a the security origin of the requester is the same … (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix win compile. Created 5 years, 11 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "content/browser/renderer_host/media/media_stream_ui_proxy.h" 5 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
6 6
7 #include "base/message_loop/message_loop.h" 7 #include "base/message_loop/message_loop.h"
8 #include "content/browser/frame_host/render_frame_host_delegate.h" 8 #include "content/browser/frame_host/render_frame_host_delegate.h"
9 #include "content/public/common/renderer_preferences.h" 9 #include "content/public/common/renderer_preferences.h"
10 #include "content/public/test/test_browser_thread.h" 10 #include "content/public/test/test_browser_thread.h"
11 #include "testing/gmock/include/gmock/gmock.h" 11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "ui/gfx/geometry/rect.h" 13 #include "ui/gfx/geometry/rect.h"
14 14
15 using testing::_; 15 using testing::_;
16 using testing::Return; 16 using testing::Return;
17 using testing::SaveArg; 17 using testing::SaveArg;
18 18
19 namespace content { 19 namespace content {
20
20 namespace { 21 namespace {
21
22 class MockRenderFrameHostDelegate : public RenderFrameHostDelegate { 22 class MockRenderFrameHostDelegate : public RenderFrameHostDelegate {
23 public: 23 public:
24 MOCK_METHOD2(RequestMediaAccessPermission, 24 MOCK_METHOD2(RequestMediaAccessPermission,
25 void(const MediaStreamRequest& request, 25 void(const MediaStreamRequest& request,
26 const MediaResponseCallback& callback)); 26 const MediaResponseCallback& callback));
27 MOCK_METHOD2(CheckMediaAccessPermission, 27 MOCK_METHOD2(CheckMediaAccessPermission,
28 bool(const GURL& security_origin, 28 bool(const GURL& security_origin,
29 MediaStreamType type)); 29 MediaStreamType type));
30 }; 30 };
31 31
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 TestBrowserThread ui_thread_; 69 TestBrowserThread ui_thread_;
70 TestBrowserThread io_thread_; 70 TestBrowserThread io_thread_;
71 71
72 MockRenderFrameHostDelegate delegate_; 72 MockRenderFrameHostDelegate delegate_;
73 MockResponseCallback response_callback_; 73 MockResponseCallback response_callback_;
74 scoped_ptr<MediaStreamUIProxy> proxy_; 74 scoped_ptr<MediaStreamUIProxy> proxy_;
75 }; 75 };
76 76
77 MATCHER_P(SameRequest, expected, "") { 77 MATCHER_P(SameRequest, expected, "") {
78 return 78 return
79 expected.render_process_id == arg.render_process_id && 79 expected->render_process_id == arg.render_process_id &&
80 expected.render_frame_id == arg.render_frame_id && 80 expected->render_frame_id == arg.render_frame_id &&
81 expected.tab_capture_device_id == arg.tab_capture_device_id && 81 expected->tab_capture_device_id == arg.tab_capture_device_id &&
82 expected.security_origin == arg.security_origin && 82 expected->security_origin == arg.security_origin &&
83 expected.request_type == arg.request_type && 83 expected->request_type == arg.request_type &&
84 expected.requested_audio_device_id == arg.requested_audio_device_id && 84 expected->requested_audio_device_id == arg.requested_audio_device_id &&
85 expected.requested_video_device_id == arg.requested_video_device_id && 85 expected->requested_video_device_id == arg.requested_video_device_id &&
86 expected.audio_type == arg.audio_type && 86 expected->audio_type == arg.audio_type &&
87 expected.video_type == arg.video_type; 87 expected->video_type == arg.video_type;
88 } 88 }
89 89
90 TEST_F(MediaStreamUIProxyTest, Deny) { 90 TEST_F(MediaStreamUIProxyTest, Deny) {
91 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, 91 scoped_ptr<MediaStreamRequest> request (
92 new MediaStreamRequest(0, 0, 0, std::string(), GURL("http://origin/"),
93 false,
92 MEDIA_GENERATE_STREAM, std::string(), 94 MEDIA_GENERATE_STREAM, std::string(),
93 std::string(), 95 std::string(),
94 MEDIA_DEVICE_AUDIO_CAPTURE, 96 MEDIA_DEVICE_AUDIO_CAPTURE,
95 MEDIA_DEVICE_VIDEO_CAPTURE); 97 MEDIA_DEVICE_VIDEO_CAPTURE));
98 MediaStreamRequest* request_ptr = request.get();
96 proxy_->RequestAccess( 99 proxy_->RequestAccess(
97 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, 100 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse,
98 base::Unretained(&response_callback_))); 101 base::Unretained(&response_callback_)));
99 MediaResponseCallback callback; 102 MediaResponseCallback callback;
100 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) 103 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr),
104 _))
101 .WillOnce(SaveArg<1>(&callback)); 105 .WillOnce(SaveArg<1>(&callback));
102 message_loop_.RunUntilIdle(); 106 message_loop_.RunUntilIdle();
103 ASSERT_FALSE(callback.is_null()); 107 ASSERT_FALSE(callback.is_null());
104 108
105 MediaStreamDevices devices; 109 MediaStreamDevices devices;
106 callback.Run(devices, MEDIA_DEVICE_OK, scoped_ptr<MediaStreamUI>()); 110 callback.Run(devices, MEDIA_DEVICE_OK, scoped_ptr<MediaStreamUI>());
107 111
108 MediaStreamDevices response; 112 MediaStreamDevices response;
109 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) 113 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _))
110 .WillOnce(SaveArg<0>(&response)); 114 .WillOnce(SaveArg<0>(&response));
111 message_loop_.RunUntilIdle(); 115 message_loop_.RunUntilIdle();
112 116
113 EXPECT_TRUE(response.empty()); 117 EXPECT_TRUE(response.empty());
114 } 118 }
115 119
116 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) { 120 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) {
117 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, 121 scoped_ptr<MediaStreamRequest> request (
122 new MediaStreamRequest(0, 0, 0, std::string(),
123 GURL("http://origin/"), false,
118 MEDIA_GENERATE_STREAM, std::string(), 124 MEDIA_GENERATE_STREAM, std::string(),
119 std::string(), 125 std::string(),
120 MEDIA_DEVICE_AUDIO_CAPTURE, 126 MEDIA_DEVICE_AUDIO_CAPTURE,
121 MEDIA_DEVICE_VIDEO_CAPTURE); 127 MEDIA_DEVICE_VIDEO_CAPTURE));
128 MediaStreamRequest* request_ptr = request.get();
122 proxy_->RequestAccess( 129 proxy_->RequestAccess(
123 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, 130 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse,
124 base::Unretained(&response_callback_))); 131 base::Unretained(&response_callback_)));
125 MediaResponseCallback callback; 132 MediaResponseCallback callback;
126 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) 133 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr),
134 _))
127 .WillOnce(SaveArg<1>(&callback)); 135 .WillOnce(SaveArg<1>(&callback));
128 message_loop_.RunUntilIdle(); 136 message_loop_.RunUntilIdle();
129 ASSERT_FALSE(callback.is_null()); 137 ASSERT_FALSE(callback.is_null());
130 138
131 MediaStreamDevices devices; 139 MediaStreamDevices devices;
132 devices.push_back( 140 devices.push_back(
133 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); 141 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic"));
134 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); 142 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI());
135 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0)); 143 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0));
136 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); 144 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass());
137 145
138 MediaStreamDevices response; 146 MediaStreamDevices response;
139 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) 147 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _))
140 .WillOnce(SaveArg<0>(&response)); 148 .WillOnce(SaveArg<0>(&response));
141 message_loop_.RunUntilIdle(); 149 message_loop_.RunUntilIdle();
142 150
143 EXPECT_FALSE(response.empty()); 151 EXPECT_FALSE(response.empty());
144 152
145 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback()); 153 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback());
146 message_loop_.RunUntilIdle(); 154 message_loop_.RunUntilIdle();
147 } 155 }
148 156
149 // Verify that the proxy can be deleted before the request is processed. 157 // Verify that the proxy can be deleted before the request is processed.
150 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) { 158 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) {
151 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, 159 scoped_ptr<MediaStreamRequest> request (
160 new MediaStreamRequest(0, 0, 0, std::string(),
161 GURL("http://origin/"), false,
152 MEDIA_GENERATE_STREAM, std::string(), 162 MEDIA_GENERATE_STREAM, std::string(),
153 std::string(), 163 std::string(),
154 MEDIA_DEVICE_AUDIO_CAPTURE, 164 MEDIA_DEVICE_AUDIO_CAPTURE,
155 MEDIA_DEVICE_VIDEO_CAPTURE); 165 MEDIA_DEVICE_VIDEO_CAPTURE));
166 MediaStreamRequest* request_ptr = request.get();
156 proxy_->RequestAccess( 167 proxy_->RequestAccess(
157 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, 168 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse,
158 base::Unretained(&response_callback_))); 169 base::Unretained(&response_callback_)));
159 MediaResponseCallback callback; 170 MediaResponseCallback callback;
160 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) 171 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr)
172 , _))
161 .WillOnce(SaveArg<1>(&callback)); 173 .WillOnce(SaveArg<1>(&callback));
162 message_loop_.RunUntilIdle(); 174 message_loop_.RunUntilIdle();
163 ASSERT_FALSE(callback.is_null()); 175 ASSERT_FALSE(callback.is_null());
164 176
165 proxy_.reset(); 177 proxy_.reset();
166 178
167 MediaStreamDevices devices; 179 MediaStreamDevices devices;
168 scoped_ptr<MediaStreamUI> ui; 180 scoped_ptr<MediaStreamUI> ui;
169 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); 181 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass());
170 } 182 }
171 183
172 TEST_F(MediaStreamUIProxyTest, StopFromUI) { 184 TEST_F(MediaStreamUIProxyTest, StopFromUI) {
173 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, 185 scoped_ptr<MediaStreamRequest> request (
186 new MediaStreamRequest(0, 0, 0, std::string(),
187 GURL("http://origin/"), false,
174 MEDIA_GENERATE_STREAM, std::string(), 188 MEDIA_GENERATE_STREAM, std::string(),
175 std::string(), 189 std::string(),
176 MEDIA_DEVICE_AUDIO_CAPTURE, 190 MEDIA_DEVICE_AUDIO_CAPTURE,
177 MEDIA_DEVICE_VIDEO_CAPTURE); 191 MEDIA_DEVICE_VIDEO_CAPTURE));
192 MediaStreamRequest* request_ptr = request.get();
178 proxy_->RequestAccess( 193 proxy_->RequestAccess(
179 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, 194 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse,
180 base::Unretained(&response_callback_))); 195 base::Unretained(&response_callback_)));
181 MediaResponseCallback callback; 196 MediaResponseCallback callback;
182 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) 197 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr)
198 , _))
183 .WillOnce(SaveArg<1>(&callback)); 199 .WillOnce(SaveArg<1>(&callback));
184 message_loop_.RunUntilIdle(); 200 message_loop_.RunUntilIdle();
185 ASSERT_FALSE(callback.is_null()); 201 ASSERT_FALSE(callback.is_null());
186 202
187 base::Closure stop_callback; 203 base::Closure stop_callback;
188 204
189 MediaStreamDevices devices; 205 MediaStreamDevices devices;
190 devices.push_back( 206 devices.push_back(
191 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); 207 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic"));
192 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); 208 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI());
(...skipping 14 matching lines...) Expand all
207 MediaStreamUIProxy::WindowIdCallback()); 223 MediaStreamUIProxy::WindowIdCallback());
208 message_loop_.RunUntilIdle(); 224 message_loop_.RunUntilIdle();
209 225
210 ASSERT_FALSE(stop_callback.is_null()); 226 ASSERT_FALSE(stop_callback.is_null());
211 EXPECT_CALL(stop_handler, OnStop()); 227 EXPECT_CALL(stop_handler, OnStop());
212 stop_callback.Run(); 228 stop_callback.Run();
213 message_loop_.RunUntilIdle(); 229 message_loop_.RunUntilIdle();
214 } 230 }
215 231
216 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) { 232 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) {
217 MediaStreamRequest request(0, 233 scoped_ptr<MediaStreamRequest> request (
218 0, 234 new MediaStreamRequest(0, 0, 0, std::string(),
219 0, 235 GURL("http://origin/"), false,
220 GURL("http://origin/"), 236 MEDIA_GENERATE_STREAM, std::string(),
221 false,
222 MEDIA_GENERATE_STREAM,
223 std::string(),
224 std::string(), 237 std::string(),
225 MEDIA_NO_SERVICE, 238 MEDIA_NO_SERVICE,
226 MEDIA_DESKTOP_VIDEO_CAPTURE); 239 MEDIA_DESKTOP_VIDEO_CAPTURE));
240 MediaStreamRequest* request_ptr = request.get();
241
227 proxy_->RequestAccess( 242 proxy_->RequestAccess(
228 request, 243 request.Pass(),
229 base::Bind(&MockResponseCallback::OnAccessRequestResponse, 244 base::Bind(&MockResponseCallback::OnAccessRequestResponse,
230 base::Unretained(&response_callback_))); 245 base::Unretained(&response_callback_)));
231 MediaResponseCallback callback; 246 MediaResponseCallback callback;
232 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) 247 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr),
248 _))
233 .WillOnce(SaveArg<1>(&callback)); 249 .WillOnce(SaveArg<1>(&callback));
234 message_loop_.RunUntilIdle(); 250 message_loop_.RunUntilIdle();
235 251
236 const int kWindowId = 1; 252 const int kWindowId = 1;
237 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); 253 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI());
238 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId)); 254 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId));
239 255
240 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, ui.Pass()); 256 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, ui.Pass());
241 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)); 257 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _));
242 258
(...skipping 13 matching lines...) Expand all
256 0, 272 0,
257 0, 273 0,
258 base::Bind(&MockResponseCallback::OnCheckResponse, 274 base::Bind(&MockResponseCallback::OnCheckResponse,
259 base::Unretained(&response_callback_))); 275 base::Unretained(&response_callback_)));
260 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _)); 276 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _));
261 EXPECT_CALL(response_callback_, OnCheckResponse(_)); 277 EXPECT_CALL(response_callback_, OnCheckResponse(_));
262 message_loop_.RunUntilIdle(); 278 message_loop_.RunUntilIdle();
263 } 279 }
264 280
265 } // content 281 } // content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698