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

Side by Side Diff: content/renderer/media/android/renderer_media_player_manager.cc

Issue 136113015: Fix fullscreen video race condition. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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 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/renderer/media/android/renderer_media_player_manager.h" 5 #include "content/renderer/media/android/renderer_media_player_manager.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "content/common/media/media_player_messages_android.h" 9 #include "content/common/media/media_player_messages_android.h"
10 #include "content/renderer/media/android/proxy_media_keys.h" 10 #include "content/renderer/media/android/proxy_media_keys.h"
11 #include "content/renderer/media/android/renderer_media_player_manager.h" 11 #include "content/renderer/media/android/renderer_media_player_manager.h"
12 #include "content/renderer/media/android/webmediaplayer_android.h" 12 #include "content/renderer/media/android/webmediaplayer_android.h"
13 #include "ui/gfx/rect_f.h" 13 #include "ui/gfx/rect_f.h"
14 14
15 // Maximum sizes for various EME message parameters. These are checks to 15 // Maximum sizes for various EME message parameters. These are checks to
16 // prevent unnecessarily large messages from being passed around, and the sizes 16 // prevent unnecessarily large messages from being passed around, and the sizes
17 // are somewhat arbitrary as the EME specification doesn't specify any limits. 17 // are somewhat arbitrary as the EME specification doesn't specify any limits.
18 static const size_t kEmeWebSessionIdMaximum = 512; 18 static const size_t kEmeWebSessionIdMaximum = 512;
19 static const size_t kEmeMessageMaximum = 10240; // 10 KB 19 static const size_t kEmeMessageMaximum = 10240; // 10 KB
20 static const size_t kEmeDestinationUrlMaximum = 2048; // 2 KB 20 static const size_t kEmeDestinationUrlMaximum = 2048; // 2 KB
21 21
22 namespace content { 22 namespace content {
23 23
24 RendererMediaPlayerManager::RendererMediaPlayerManager(RenderView* render_view) 24 RendererMediaPlayerManager::RendererMediaPlayerManager(RenderView* render_view)
25 : RenderViewObserver(render_view), 25 : RenderViewObserver(render_view),
26 next_media_player_id_(0), 26 next_media_player_id_(0),
27 fullscreen_frame_(NULL) {} 27 fullscreen_frame_(NULL),
28 pending_fullscreen_frame_(NULL) {}
28 29
29 RendererMediaPlayerManager::~RendererMediaPlayerManager() { 30 RendererMediaPlayerManager::~RendererMediaPlayerManager() {
30 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; 31 std::map<int, WebMediaPlayerAndroid*>::iterator player_it;
31 for (player_it = media_players_.begin(); 32 for (player_it = media_players_.begin();
32 player_it != media_players_.end(); ++player_it) { 33 player_it != media_players_.end(); ++player_it) {
33 WebMediaPlayerAndroid* player = player_it->second; 34 WebMediaPlayerAndroid* player = player_it->second;
34 player->Detach(); 35 player->Detach();
35 } 36 }
36 37
37 Send(new MediaPlayerHostMsg_DestroyAllMediaPlayers(routing_id())); 38 Send(new MediaPlayerHostMsg_DestroyAllMediaPlayers(routing_id()));
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 if (player) 217 if (player)
217 player->OnMediaPlayerPause(); 218 player->OnMediaPlayerPause();
218 } 219 }
219 220
220 void RendererMediaPlayerManager::OnRequestFullscreen(int player_id) { 221 void RendererMediaPlayerManager::OnRequestFullscreen(int player_id) {
221 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id); 222 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
222 if (player) 223 if (player)
223 player->OnRequestFullscreen(); 224 player->OnRequestFullscreen();
224 } 225 }
225 226
226 void RendererMediaPlayerManager::EnterFullscreen(int player_id) { 227 void RendererMediaPlayerManager::EnterFullscreen(int player_id,
228 blink::WebFrame* frame) {
229 pending_fullscreen_frame_ = frame;
227 Send(new MediaPlayerHostMsg_EnterFullscreen(routing_id(), player_id)); 230 Send(new MediaPlayerHostMsg_EnterFullscreen(routing_id(), player_id));
228 } 231 }
229 232
230 void RendererMediaPlayerManager::ExitFullscreen(int player_id) { 233 void RendererMediaPlayerManager::ExitFullscreen(int player_id) {
231 Send(new MediaPlayerHostMsg_ExitFullscreen(routing_id(), player_id)); 234 Send(new MediaPlayerHostMsg_ExitFullscreen(routing_id(), player_id));
232 } 235 }
233 236
234 void RendererMediaPlayerManager::InitializeCDM(int media_keys_id, 237 void RendererMediaPlayerManager::InitializeCDM(int media_keys_id,
235 ProxyMediaKeys* media_keys, 238 ProxyMediaKeys* media_keys,
236 const std::vector<uint8>& uuid, 239 const std::vector<uint8>& uuid,
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 std::map<int, ProxyMediaKeys*>::iterator iter = 381 std::map<int, ProxyMediaKeys*>::iterator iter =
379 media_keys_.find(media_keys_id); 382 media_keys_.find(media_keys_id);
380 return (iter != media_keys_.end()) ? iter->second : NULL; 383 return (iter != media_keys_.end()) ? iter->second : NULL;
381 } 384 }
382 385
383 bool RendererMediaPlayerManager::CanEnterFullscreen(blink::WebFrame* frame) { 386 bool RendererMediaPlayerManager::CanEnterFullscreen(blink::WebFrame* frame) {
384 return !fullscreen_frame_ || IsInFullscreen(frame); 387 return !fullscreen_frame_ || IsInFullscreen(frame);
385 } 388 }
386 389
387 void RendererMediaPlayerManager::DidEnterFullscreen(blink::WebFrame* frame) { 390 void RendererMediaPlayerManager::DidEnterFullscreen(blink::WebFrame* frame) {
391 pending_fullscreen_frame_ = NULL;
qinmin 2014/01/28 17:41:34 what if ExitFullscreen() is called before this cal
388 fullscreen_frame_ = frame; 392 fullscreen_frame_ = frame;
389 } 393 }
390 394
391 void RendererMediaPlayerManager::DidExitFullscreen() { 395 void RendererMediaPlayerManager::DidExitFullscreen() {
392 fullscreen_frame_ = NULL; 396 fullscreen_frame_ = NULL;
393 } 397 }
394 398
395 bool RendererMediaPlayerManager::IsInFullscreen(blink::WebFrame* frame) { 399 bool RendererMediaPlayerManager::IsInFullscreen(blink::WebFrame* frame) {
396 return fullscreen_frame_ == frame; 400 return fullscreen_frame_ == frame;
397 } 401 }
398 402
403 bool RendererMediaPlayerManager::ShouldEnterFullscreen(blink::WebFrame* frame) {
qinmin 2014/01/28 17:41:34 This logic is also needed for CanEnterFullscreen()
404 return fullscreen_frame_ == frame || pending_fullscreen_frame_ == frame;
405 }
406
399 #if defined(VIDEO_HOLE) 407 #if defined(VIDEO_HOLE)
400 void RendererMediaPlayerManager::RequestExternalSurface( 408 void RendererMediaPlayerManager::RequestExternalSurface(
401 int player_id, 409 int player_id,
402 const gfx::RectF& geometry) { 410 const gfx::RectF& geometry) {
403 Send(new MediaPlayerHostMsg_NotifyExternalSurface( 411 Send(new MediaPlayerHostMsg_NotifyExternalSurface(
404 routing_id(), player_id, true, geometry)); 412 routing_id(), player_id, true, geometry));
405 } 413 }
406 414
407 void RendererMediaPlayerManager::DidCommitCompositorFrame() { 415 void RendererMediaPlayerManager::DidCommitCompositorFrame() {
408 std::map<int, gfx::RectF> geometry_change; 416 std::map<int, gfx::RectF> geometry_change;
(...skipping 19 matching lines...) Expand all
428 gfx::RectF rect; 436 gfx::RectF rect;
429 if (player->RetrieveGeometryChange(&rect)) { 437 if (player->RetrieveGeometryChange(&rect)) {
430 (*changes)[player_it->first] = rect; 438 (*changes)[player_it->first] = rect;
431 } 439 }
432 } 440 }
433 } 441 }
434 } 442 }
435 #endif // defined(VIDEO_HOLE) 443 #endif // defined(VIDEO_HOLE)
436 444
437 } // namespace content 445 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698