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

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 problem with that the ui_request_ was used for state updates. 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->security_origin == arg.security_origin &&
82 expected.security_origin == arg.security_origin && 82 expected->request_type == arg.request_type &&
83 expected.request_type == arg.request_type && 83 expected->requested_audio_device_id == arg.requested_audio_device_id &&
84 expected.requested_audio_device_id == arg.requested_audio_device_id && 84 expected->requested_video_device_id == arg.requested_video_device_id &&
85 expected.requested_video_device_id == arg.requested_video_device_id && 85 expected->audio_type == arg.audio_type &&
86 expected.audio_type == arg.audio_type && 86 expected->video_type == arg.video_type;
87 expected.video_type == arg.video_type;
88 } 87 }
89 88
90 TEST_F(MediaStreamUIProxyTest, Deny) { 89 TEST_F(MediaStreamUIProxyTest, Deny) {
91 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, 90 scoped_ptr<MediaStreamRequest> request (
91 new MediaStreamRequest(0, 0, 0, GURL("http://origin/"),
92 false,
92 MEDIA_GENERATE_STREAM, std::string(), 93 MEDIA_GENERATE_STREAM, std::string(),
93 std::string(), 94 std::string(),
94 MEDIA_DEVICE_AUDIO_CAPTURE, 95 MEDIA_DEVICE_AUDIO_CAPTURE,
95 MEDIA_DEVICE_VIDEO_CAPTURE); 96 MEDIA_DEVICE_VIDEO_CAPTURE));
97 MediaStreamRequest* request_ptr = request.get();
96 proxy_->RequestAccess( 98 proxy_->RequestAccess(
97 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, 99 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse,
98 base::Unretained(&response_callback_))); 100 base::Unretained(&response_callback_)));
99 MediaResponseCallback callback; 101 MediaResponseCallback callback;
100 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) 102 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr),
103 _))
101 .WillOnce(SaveArg<1>(&callback)); 104 .WillOnce(SaveArg<1>(&callback));
102 message_loop_.RunUntilIdle(); 105 message_loop_.RunUntilIdle();
103 ASSERT_FALSE(callback.is_null()); 106 ASSERT_FALSE(callback.is_null());
104 107
105 MediaStreamDevices devices; 108 MediaStreamDevices devices;
106 callback.Run(devices, MEDIA_DEVICE_OK, scoped_ptr<MediaStreamUI>()); 109 callback.Run(devices, MEDIA_DEVICE_OK, scoped_ptr<MediaStreamUI>());
107 110
108 MediaStreamDevices response; 111 MediaStreamDevices response;
109 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) 112 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _))
110 .WillOnce(SaveArg<0>(&response)); 113 .WillOnce(SaveArg<0>(&response));
111 message_loop_.RunUntilIdle(); 114 message_loop_.RunUntilIdle();
112 115
113 EXPECT_TRUE(response.empty()); 116 EXPECT_TRUE(response.empty());
114 } 117 }
115 118
116 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) { 119 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) {
117 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, 120 scoped_ptr<MediaStreamRequest> request (
121 new MediaStreamRequest(0, 0, 0,
122 GURL("http://origin/"), false,
118 MEDIA_GENERATE_STREAM, std::string(), 123 MEDIA_GENERATE_STREAM, std::string(),
119 std::string(), 124 std::string(),
120 MEDIA_DEVICE_AUDIO_CAPTURE, 125 MEDIA_DEVICE_AUDIO_CAPTURE,
121 MEDIA_DEVICE_VIDEO_CAPTURE); 126 MEDIA_DEVICE_VIDEO_CAPTURE));
127 MediaStreamRequest* request_ptr = request.get();
122 proxy_->RequestAccess( 128 proxy_->RequestAccess(
123 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, 129 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse,
124 base::Unretained(&response_callback_))); 130 base::Unretained(&response_callback_)));
125 MediaResponseCallback callback; 131 MediaResponseCallback callback;
126 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) 132 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr),
133 _))
127 .WillOnce(SaveArg<1>(&callback)); 134 .WillOnce(SaveArg<1>(&callback));
128 message_loop_.RunUntilIdle(); 135 message_loop_.RunUntilIdle();
129 ASSERT_FALSE(callback.is_null()); 136 ASSERT_FALSE(callback.is_null());
130 137
131 MediaStreamDevices devices; 138 MediaStreamDevices devices;
132 devices.push_back( 139 devices.push_back(
133 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); 140 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic"));
134 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); 141 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI());
135 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0)); 142 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0));
136 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); 143 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass());
137 144
138 MediaStreamDevices response; 145 MediaStreamDevices response;
139 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) 146 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _))
140 .WillOnce(SaveArg<0>(&response)); 147 .WillOnce(SaveArg<0>(&response));
141 message_loop_.RunUntilIdle(); 148 message_loop_.RunUntilIdle();
142 149
143 EXPECT_FALSE(response.empty()); 150 EXPECT_FALSE(response.empty());
144 151
145 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback()); 152 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback());
146 message_loop_.RunUntilIdle(); 153 message_loop_.RunUntilIdle();
147 } 154 }
148 155
149 // Verify that the proxy can be deleted before the request is processed. 156 // Verify that the proxy can be deleted before the request is processed.
150 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) { 157 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) {
151 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, 158 scoped_ptr<MediaStreamRequest> request (
159 new MediaStreamRequest(0, 0, 0,
160 GURL("http://origin/"), false,
152 MEDIA_GENERATE_STREAM, std::string(), 161 MEDIA_GENERATE_STREAM, std::string(),
153 std::string(), 162 std::string(),
154 MEDIA_DEVICE_AUDIO_CAPTURE, 163 MEDIA_DEVICE_AUDIO_CAPTURE,
155 MEDIA_DEVICE_VIDEO_CAPTURE); 164 MEDIA_DEVICE_VIDEO_CAPTURE));
165 MediaStreamRequest* request_ptr = request.get();
156 proxy_->RequestAccess( 166 proxy_->RequestAccess(
157 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, 167 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse,
158 base::Unretained(&response_callback_))); 168 base::Unretained(&response_callback_)));
159 MediaResponseCallback callback; 169 MediaResponseCallback callback;
160 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) 170 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr)
171 , _))
161 .WillOnce(SaveArg<1>(&callback)); 172 .WillOnce(SaveArg<1>(&callback));
162 message_loop_.RunUntilIdle(); 173 message_loop_.RunUntilIdle();
163 ASSERT_FALSE(callback.is_null()); 174 ASSERT_FALSE(callback.is_null());
164 175
165 proxy_.reset(); 176 proxy_.reset();
166 177
167 MediaStreamDevices devices; 178 MediaStreamDevices devices;
168 scoped_ptr<MediaStreamUI> ui; 179 scoped_ptr<MediaStreamUI> ui;
169 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); 180 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass());
170 } 181 }
171 182
172 TEST_F(MediaStreamUIProxyTest, StopFromUI) { 183 TEST_F(MediaStreamUIProxyTest, StopFromUI) {
173 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, 184 scoped_ptr<MediaStreamRequest> request (
185 new MediaStreamRequest(0, 0, 0,
186 GURL("http://origin/"), false,
174 MEDIA_GENERATE_STREAM, std::string(), 187 MEDIA_GENERATE_STREAM, std::string(),
175 std::string(), 188 std::string(),
176 MEDIA_DEVICE_AUDIO_CAPTURE, 189 MEDIA_DEVICE_AUDIO_CAPTURE,
177 MEDIA_DEVICE_VIDEO_CAPTURE); 190 MEDIA_DEVICE_VIDEO_CAPTURE));
191 MediaStreamRequest* request_ptr = request.get();
178 proxy_->RequestAccess( 192 proxy_->RequestAccess(
179 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, 193 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse,
180 base::Unretained(&response_callback_))); 194 base::Unretained(&response_callback_)));
181 MediaResponseCallback callback; 195 MediaResponseCallback callback;
182 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) 196 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr)
197 , _))
183 .WillOnce(SaveArg<1>(&callback)); 198 .WillOnce(SaveArg<1>(&callback));
184 message_loop_.RunUntilIdle(); 199 message_loop_.RunUntilIdle();
185 ASSERT_FALSE(callback.is_null()); 200 ASSERT_FALSE(callback.is_null());
186 201
187 base::Closure stop_callback; 202 base::Closure stop_callback;
188 203
189 MediaStreamDevices devices; 204 MediaStreamDevices devices;
190 devices.push_back( 205 devices.push_back(
191 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); 206 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic"));
192 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); 207 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI());
(...skipping 14 matching lines...) Expand all
207 MediaStreamUIProxy::WindowIdCallback()); 222 MediaStreamUIProxy::WindowIdCallback());
208 message_loop_.RunUntilIdle(); 223 message_loop_.RunUntilIdle();
209 224
210 ASSERT_FALSE(stop_callback.is_null()); 225 ASSERT_FALSE(stop_callback.is_null());
211 EXPECT_CALL(stop_handler, OnStop()); 226 EXPECT_CALL(stop_handler, OnStop());
212 stop_callback.Run(); 227 stop_callback.Run();
213 message_loop_.RunUntilIdle(); 228 message_loop_.RunUntilIdle();
214 } 229 }
215 230
216 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) { 231 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) {
217 MediaStreamRequest request(0, 232 scoped_ptr<MediaStreamRequest> request (
218 0, 233 new MediaStreamRequest(0, 0, 0,
219 0, 234 GURL("http://origin/"), false,
220 GURL("http://origin/"), 235 MEDIA_GENERATE_STREAM, std::string(),
221 false,
222 MEDIA_GENERATE_STREAM,
223 std::string(),
224 std::string(), 236 std::string(),
225 MEDIA_NO_SERVICE, 237 MEDIA_NO_SERVICE,
226 MEDIA_DESKTOP_VIDEO_CAPTURE); 238 MEDIA_DESKTOP_VIDEO_CAPTURE));
239 MediaStreamRequest* request_ptr = request.get();
240
227 proxy_->RequestAccess( 241 proxy_->RequestAccess(
228 request, 242 request.Pass(),
229 base::Bind(&MockResponseCallback::OnAccessRequestResponse, 243 base::Bind(&MockResponseCallback::OnAccessRequestResponse,
230 base::Unretained(&response_callback_))); 244 base::Unretained(&response_callback_)));
231 MediaResponseCallback callback; 245 MediaResponseCallback callback;
232 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) 246 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr),
247 _))
233 .WillOnce(SaveArg<1>(&callback)); 248 .WillOnce(SaveArg<1>(&callback));
234 message_loop_.RunUntilIdle(); 249 message_loop_.RunUntilIdle();
235 250
236 const int kWindowId = 1; 251 const int kWindowId = 1;
237 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); 252 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI());
238 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId)); 253 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId));
239 254
240 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, ui.Pass()); 255 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, ui.Pass());
241 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)); 256 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _));
242 257
(...skipping 13 matching lines...) Expand all
256 0, 271 0,
257 0, 272 0,
258 base::Bind(&MockResponseCallback::OnCheckResponse, 273 base::Bind(&MockResponseCallback::OnCheckResponse,
259 base::Unretained(&response_callback_))); 274 base::Unretained(&response_callback_)));
260 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _)); 275 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _));
261 EXPECT_CALL(response_callback_, OnCheckResponse(_)); 276 EXPECT_CALL(response_callback_, OnCheckResponse(_));
262 message_loop_.RunUntilIdle(); 277 message_loop_.RunUntilIdle();
263 } 278 }
264 279
265 } // content 280 } // content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698