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

Side by Side Diff: content/browser/media/media_web_contents_observer.cc

Issue 2693203002: Provide a WebContents API to discover the playback of a fullscreen video. (Closed)
Patch Set: Created 3 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/media/media_web_contents_observer.h" 5 #include "content/browser/media/media_web_contents_observer.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "build/build_config.h" 9 #include "build/build_config.h"
10 #include "content/browser/media/audible_metrics.h" 10 #include "content/browser/media/audible_metrics.h"
(...skipping 13 matching lines...) Expand all
24 static AudibleMetrics* metrics = new AudibleMetrics(); 24 static AudibleMetrics* metrics = new AudibleMetrics();
25 return metrics; 25 return metrics;
26 } 26 }
27 27
28 } // anonymous namespace 28 } // anonymous namespace
29 29
30 MediaWebContentsObserver::MediaWebContentsObserver(WebContents* web_contents) 30 MediaWebContentsObserver::MediaWebContentsObserver(WebContents* web_contents)
31 : WebContentsObserver(web_contents), 31 : WebContentsObserver(web_contents),
32 session_controllers_manager_(this) {} 32 session_controllers_manager_(this) {}
33 33
34 MediaWebContentsObserver::~MediaWebContentsObserver() {} 34 MediaWebContentsObserver::~MediaWebContentsObserver() = default;
35 35
36 void MediaWebContentsObserver::WebContentsDestroyed() { 36 void MediaWebContentsObserver::WebContentsDestroyed() {
37 GetAudibleMetrics()->UpdateAudibleWebContentsState(web_contents(), false); 37 GetAudibleMetrics()->UpdateAudibleWebContentsState(web_contents(), false);
38 } 38 }
39 39
40 void MediaWebContentsObserver::RenderFrameDeleted( 40 void MediaWebContentsObserver::RenderFrameDeleted(
41 RenderFrameHost* render_frame_host) { 41 RenderFrameHost* render_frame_host) {
42 ClearPowerSaveBlockers(render_frame_host); 42 ClearPowerSaveBlockers(render_frame_host);
43 session_controllers_manager_.RenderFrameDeleted(render_frame_host); 43 session_controllers_manager_.RenderFrameDeleted(render_frame_host);
44
45 if (fullscreen_dominant_video_.first.first == render_frame_host)
46 fullscreen_dominant_video_.first = MediaPlayerId(nullptr, 0);
44 } 47 }
45 48
46 void MediaWebContentsObserver::MaybeUpdateAudibleState() { 49 void MediaWebContentsObserver::MaybeUpdateAudibleState() {
47 AudioStreamMonitor* audio_stream_monitor = 50 AudioStreamMonitor* audio_stream_monitor =
48 static_cast<WebContentsImpl*>(web_contents())->audio_stream_monitor(); 51 static_cast<WebContentsImpl*>(web_contents())->audio_stream_monitor();
49 52
50 if (audio_stream_monitor->WasRecentlyAudible()) { 53 if (audio_stream_monitor->WasRecentlyAudible()) {
51 if (!audio_power_save_blocker_) 54 if (!audio_power_save_blocker_)
52 CreateAudioPowerSaveBlocker(); 55 CreateAudioPowerSaveBlocker();
53 } else { 56 } else {
54 audio_power_save_blocker_.reset(); 57 audio_power_save_blocker_.reset();
55 } 58 }
56 59
57 GetAudibleMetrics()->UpdateAudibleWebContentsState( 60 GetAudibleMetrics()->UpdateAudibleWebContentsState(
58 web_contents(), audio_stream_monitor->IsCurrentlyAudible()); 61 web_contents(), audio_stream_monitor->IsCurrentlyAudible());
59 } 62 }
60 63
64 bool MediaWebContentsObserver::HasActiveFullscreenDominantVideo() const {
65 DCHECK(web_contents()->IsFullscreen());
66
67 // First check if there is a fullscreen or dominant video registered.
68 if (fullscreen_dominant_video_.first.first == nullptr)
69 return false;
70 if (!fullscreen_dominant_video_.second.fullscreen &&
71 !fullscreen_dominant_video_.second.dominant) {
72 return false;
73 }
74
75 // It has to be active.
76 const auto& players =
77 active_video_players_.find(fullscreen_dominant_video_.first.first);
78 if (players == active_video_players_.end())
79 return false;
80 if (players->second.find(fullscreen_dominant_video_.first.second) ==
81 players->second.end())
82 return false;
83
84 return true;
85 }
86
61 bool MediaWebContentsObserver::OnMessageReceived( 87 bool MediaWebContentsObserver::OnMessageReceived(
62 const IPC::Message& msg, 88 const IPC::Message& msg,
63 RenderFrameHost* render_frame_host) { 89 RenderFrameHost* render_frame_host) {
64 bool handled = true; 90 bool handled = true;
65 // TODO(dalecurtis): These should no longer be FrameHostMsg. 91 // TODO(dalecurtis): These should no longer be FrameHostMsg.
66 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(MediaWebContentsObserver, msg, 92 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(MediaWebContentsObserver, msg,
67 render_frame_host) 93 render_frame_host)
68 IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnMediaDestroyed, 94 IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnMediaDestroyed,
69 OnMediaDestroyed) 95 OnMediaDestroyed)
70 IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnMediaPaused, OnMediaPaused) 96 IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnMediaPaused, OnMediaPaused)
71 IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnMediaPlaying, 97 IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnMediaPlaying,
72 OnMediaPlaying) 98 OnMediaPlaying)
99 IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnMediaFullscreenChange,
100 OnMediaFullscreenChange)
101 IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnMediaDominantChange,
102 OnMediaDominantChange)
73 IPC_MESSAGE_UNHANDLED(handled = false) 103 IPC_MESSAGE_UNHANDLED(handled = false)
74 IPC_END_MESSAGE_MAP() 104 IPC_END_MESSAGE_MAP()
75 return handled; 105 return handled;
76 } 106 }
77 107
78 void MediaWebContentsObserver::WasShown() { 108 void MediaWebContentsObserver::WasShown() {
79 // Restore power save blocker if there are active video players running. 109 // Restore power save blocker if there are active video players running.
80 if (!active_video_players_.empty() && !video_power_save_blocker_) 110 if (!active_video_players_.empty() && !video_power_save_blocker_)
81 CreateVideoPowerSaveBlocker(); 111 CreateVideoPowerSaveBlocker();
82 } 112 }
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 return; 179 return;
150 } 180 }
151 181
152 // Notify observers of the new player. 182 // Notify observers of the new player.
153 DCHECK(has_audio || has_video); 183 DCHECK(has_audio || has_video);
154 static_cast<WebContentsImpl*>(web_contents()) 184 static_cast<WebContentsImpl*>(web_contents())
155 ->MediaStartedPlaying(WebContentsObserver::MediaPlayerInfo(has_video), 185 ->MediaStartedPlaying(WebContentsObserver::MediaPlayerInfo(has_video),
156 id); 186 id);
157 } 187 }
158 188
189 void MediaWebContentsObserver::OnMediaFullscreenChange(
190 RenderFrameHost* render_frame_host,
191 int delegate_id,
192 bool is_fullscreen) {
193 const MediaPlayerId id(render_frame_host, delegate_id);
194
195 if (fullscreen_dominant_video_.first == id) {
196 fullscreen_dominant_video_.second.fullscreen = is_fullscreen;
197 } else if (is_fullscreen) {
198 fullscreen_dominant_video_.first = id;
199 fullscreen_dominant_video_.second = FullscreenDominantInfo(true, false);
200 }
201 }
202
203 void MediaWebContentsObserver::OnMediaDominantChange(
204 RenderFrameHost* render_frame_host,
205 int delegate_id,
206 bool is_dominant) {
207 const MediaPlayerId id(render_frame_host, delegate_id);
208
209 if (fullscreen_dominant_video_.first == id) {
210 fullscreen_dominant_video_.second.dominant = is_dominant;
211 } else if (is_dominant) {
212 fullscreen_dominant_video_.first = id;
213 fullscreen_dominant_video_.second = FullscreenDominantInfo(false, true);
214 }
215 }
216
159 void MediaWebContentsObserver::ClearPowerSaveBlockers( 217 void MediaWebContentsObserver::ClearPowerSaveBlockers(
160 RenderFrameHost* render_frame_host) { 218 RenderFrameHost* render_frame_host) {
161 std::set<MediaPlayerId> removed_players; 219 std::set<MediaPlayerId> removed_players;
162 RemoveAllMediaPlayerEntries(render_frame_host, &active_video_players_, 220 RemoveAllMediaPlayerEntries(render_frame_host, &active_video_players_,
163 &removed_players); 221 &removed_players);
164 std::set<MediaPlayerId> video_players(removed_players); 222 std::set<MediaPlayerId> video_players(removed_players);
165 RemoveAllMediaPlayerEntries(render_frame_host, &active_audio_players_, 223 RemoveAllMediaPlayerEntries(render_frame_host, &active_audio_players_,
166 &removed_players); 224 &removed_players);
167 MaybeReleasePowerSaveBlockers(); 225 MaybeReleasePowerSaveBlockers();
168 226
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 if (it == player_map->end()) 298 if (it == player_map->end())
241 return; 299 return;
242 300
243 for (int delegate_id : it->second) 301 for (int delegate_id : it->second)
244 removed_players->insert(MediaPlayerId(render_frame_host, delegate_id)); 302 removed_players->insert(MediaPlayerId(render_frame_host, delegate_id));
245 303
246 player_map->erase(it); 304 player_map->erase(it);
247 } 305 }
248 306
249 } // namespace content 307 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698