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

Side by Side Diff: chromecast/browser/cast_media_blocker.cc

Issue 2453623003: Decouple MediaSession messages from WebContents (full patch) (Closed)
Patch Set: addressed all existing comments Created 4 years, 1 month 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 "chromecast/browser/cast_media_blocker.h" 5 #include "chromecast/browser/cast_media_blocker.h"
6 6
7 #include "base/callback.h"
8 #include "base/threading/thread_checker.h" 7 #include "base/threading/thread_checker.h"
8 #include "content/public/browser/media_session.h"
9 #include "content/public/browser/web_contents.h" 9 #include "content/public/browser/web_contents.h"
10 10
11 namespace chromecast { 11 namespace chromecast {
12 namespace shell { 12 namespace shell {
13 13
14 CastMediaBlocker::CastMediaBlocker(content::WebContents* web_contents) 14 CastMediaBlocker::CastMediaBlocker(content::MediaSession* media_session,
15 : CastMediaBlocker::CastMediaBlocker( 15 content::WebContents* web_contents)
16 web_contents, 16 : content::MediaSessionObserver(media_session),
17 base::Bind(&CastMediaBlocker::Suspend, base::Unretained(this)), 17 content::WebContentsObserver(web_contents),
18 base::Bind(&CastMediaBlocker::Resume, base::Unretained(this))) {} 18 media_session_(media_session),
19
20 CastMediaBlocker::CastMediaBlocker(content::WebContents* web_contents,
21 const base::Closure& suspend_cb,
22 const base::Closure& resume_cb)
23 : content::WebContentsObserver(web_contents),
24 suspend_cb_(suspend_cb),
25 resume_cb_(resume_cb),
26 blocked_(false), 19 blocked_(false),
27 paused_by_user_(true), 20 paused_by_user_(true),
28 suspended_(true), 21 suspended_(true),
29 controllable_(false) {} 22 controllable_(false) {}
30 23
31 CastMediaBlocker::~CastMediaBlocker() {} 24 CastMediaBlocker::~CastMediaBlocker() {}
32 25
33 void CastMediaBlocker::BlockMediaLoading(bool blocked) { 26 void CastMediaBlocker::BlockMediaLoading(bool blocked) {
34 if (blocked_ == blocked) 27 if (blocked_ == blocked)
35 return; 28 return;
36 29
37 blocked_ = blocked; 30 blocked_ = blocked;
38 UpdateMediaBlockedState(); 31 UpdateMediaBlockedState();
39 32
40 LOG(INFO) << __FUNCTION__ << " blocked=" << blocked_ 33 LOG(INFO) << __FUNCTION__ << " blocked=" << blocked_
41 << " suspended=" << suspended_ << " controllable=" << controllable_ 34 << " suspended=" << suspended_ << " controllable=" << controllable_
42 << " paused_by_user=" << paused_by_user_; 35 << " paused_by_user=" << paused_by_user_;
43 36
44 // If blocking media, suspend if possible. 37 // If blocking media, suspend if possible.
45 if (blocked_) { 38 if (blocked_) {
46 if (!suspended_ && controllable_) { 39 if (!suspended_ && controllable_) {
47 suspend_cb_.Run(); 40 Suspend();
48 } 41 }
49 return; 42 return;
50 } 43 }
51 44
52 // If unblocking media, resume if media was not paused by user. 45 // If unblocking media, resume if media was not paused by user.
53 if (!paused_by_user_ && suspended_ && controllable_) { 46 if (!paused_by_user_ && suspended_ && controllable_) {
54 paused_by_user_ = true; 47 paused_by_user_ = true;
55 resume_cb_.Run(); 48 Resume();
56 } 49 }
57 } 50 }
58 51
59 void CastMediaBlocker::MediaSessionStateChanged(bool is_controllable, 52 void CastMediaBlocker::MediaSessionStateChanged(bool is_controllable,
60 bool is_suspended) { 53 bool is_suspended) {
61 LOG(INFO) << __FUNCTION__ << " blocked=" << blocked_ 54 LOG(INFO) << __FUNCTION__ << " blocked=" << blocked_
62 << " is_suspended=" << is_suspended 55 << " is_suspended=" << is_suspended
63 << " is_controllable=" << is_controllable 56 << " is_controllable=" << is_controllable
64 << " paused_by_user=" << paused_by_user_; 57 << " paused_by_user=" << paused_by_user_;
65 58
66 // Process controllability first. 59 // Process controllability first.
67 if (controllable_ != is_controllable) { 60 if (controllable_ != is_controllable) {
68 controllable_ = is_controllable; 61 controllable_ = is_controllable;
69 62
70 // If not blocked, and we regain control and the media wasn't paused when 63 // If not blocked, and we regain control and the media wasn't paused when
71 // blocked, resume media if suspended. 64 // blocked, resume media if suspended.
72 if (!blocked_ && !paused_by_user_ && is_suspended && controllable_) { 65 if (!blocked_ && !paused_by_user_ && is_suspended && controllable_) {
73 paused_by_user_ = true; 66 paused_by_user_ = true;
74 resume_cb_.Run(); 67 Resume();
75 } 68 }
76 69
77 // Suspend if blocked and the session becomes controllable. 70 // Suspend if blocked and the session becomes controllable.
78 if (blocked_ && !is_suspended && controllable_) { 71 if (blocked_ && !is_suspended && controllable_) {
79 // Only suspend if suspended_ doesn't change. Otherwise, this will be 72 // Only suspend if suspended_ doesn't change. Otherwise, this will be
80 // handled in the suspended changed block. 73 // handled in the suspended changed block.
81 if (suspended_ == is_suspended) 74 if (suspended_ == is_suspended)
82 suspend_cb_.Run(); 75 Suspend();
83 } 76 }
84 } 77 }
85 78
86 // Process suspended state next. 79 // Process suspended state next.
87 if (suspended_ != is_suspended) { 80 if (suspended_ != is_suspended) {
88 suspended_ = is_suspended; 81 suspended_ = is_suspended;
89 // If blocking, suspend media whenever possible. 82 // If blocking, suspend media whenever possible.
90 if (blocked_ && !suspended_) { 83 if (blocked_ && !suspended_) {
91 // If media was resumed when blocked, the user tried to play music. 84 // If media was resumed when blocked, the user tried to play music.
92 paused_by_user_ = false; 85 paused_by_user_ = false;
93 if (controllable_) 86 if (controllable_)
94 suspend_cb_.Run(); 87 Suspend();
95 } 88 }
96 89
97 // If not blocking, cache the user's play intent. 90 // If not blocking, cache the user's play intent.
98 if (!blocked_) 91 if (!blocked_)
99 paused_by_user_ = suspended_; 92 paused_by_user_ = suspended_;
100 } 93 }
101 } 94 }
102 95
96 void CastMediaBlocker::MediaSessionDestroyed() {
97 media_session_ = nullptr;
98 }
99
103 void CastMediaBlocker::Suspend() { 100 void CastMediaBlocker::Suspend() {
104 if (!web_contents()) 101 if (!media_session_)
105 return; 102 return;
106 103
107 LOG(INFO) << "Suspending media session."; 104 LOG(INFO) << "Suspending media session.";
108 web_contents()->SuspendMediaSession(); 105 media_session_->Suspend(content::MediaSession::SuspendType::SYSTEM);
109 } 106 }
110 107
111 void CastMediaBlocker::Resume() { 108 void CastMediaBlocker::Resume() {
112 if (!web_contents()) 109 if (!media_session_)
113 return; 110 return;
114 111
115 LOG(INFO) << "Resuming media session."; 112 LOG(INFO) << "Resuming media session.";
116 web_contents()->ResumeMediaSession(); 113 media_session_->Resume(content::MediaSession::SuspendType::SYSTEM);
117 } 114 }
118 115
119 } // namespace shell 116 } // namespace shell
120 } // namespace chromecast 117 } // namespace chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698