Chromium Code Reviews| Index: content/browser/media/session/pepper/pepper_web_contents_observer.cc |
| diff --git a/content/browser/media/session/pepper/pepper_web_contents_observer.cc b/content/browser/media/session/pepper/pepper_web_contents_observer.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..dd41c1e36d9a6d1508ec266533429878f45883f0 |
| --- /dev/null |
| +++ b/content/browser/media/session/pepper/pepper_web_contents_observer.cc |
| @@ -0,0 +1,80 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/media/session/pepper/pepper_web_contents_observer.h" |
| + |
| +#include "base/feature_list.h" |
| +#include "base/logging.h" |
| +#include "content/browser/media/session/media_session.h" |
| +#include "content/browser/media/session/pepper/pepper_player_delegate.h" |
| +#include "content/common/frame_messages.h" |
| +#include "ipc/ipc_message_macros.h" |
| +#include "media/base/media_switches.h" |
| + |
| +namespace content { |
| + |
| +PepperWebContentsObserver::PepperWebContentsObserver(WebContents *web_contents) |
| + : WebContentsObserver(web_contents), |
| + media_session_(MediaSession::Get(web_contents)) {} |
| + |
| +PepperWebContentsObserver::~PepperWebContentsObserver() = default; |
| + |
| +void PepperWebContentsObserver::WebContentsDestroyed() { |
| + for (auto& instance_player : players_map_) { |
| + OnPepperStopsPlayback(instance_player.first); |
| + } |
| +} |
| + |
| +void PepperWebContentsObserver::PepperInstanceCreated(int32_t pp_instance) { |
| + DCHECK_EQ(players_map_.count(pp_instance), 0u); |
| + players_map_[pp_instance].reset(new PepperPlayerDelegate(this, pp_instance)); |
| +} |
| + |
| +void PepperWebContentsObserver::PepperInstanceDeleted(int32_t pp_instance) { |
| + DCHECK_EQ(players_map_.count(pp_instance), 1u); |
| + |
| + // Only remove the player from MediaSession once the Pepper instance |
| + // is deleted. |
| + if (active_players_.count(pp_instance)) |
| + media_session_->RemovePlayer(players_map_[pp_instance].get(), 0); |
| + |
| + players_map_.erase(pp_instance); |
| + active_players_.erase(pp_instance); |
| +} |
| + |
| +bool PepperWebContentsObserver::OnMessageReceived( |
| + const IPC::Message& msg, RenderFrameHost* render_frame_host) { |
| + if (!base::FeatureList::IsEnabled(media::kFlashJoinsMediaSession)) |
| + return true; |
| + |
| + bool handled = true; |
| + IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(PepperWebContentsObserver, msg, |
| + render_frame_host) |
| + IPC_MESSAGE_HANDLER(FrameHostMsg_PepperStartsPlayback, |
| + OnPepperStartsPlayback) |
| + IPC_MESSAGE_HANDLER(FrameHostMsg_PepperStopsPlayback, |
| + OnPepperStopsPlayback) |
| + IPC_MESSAGE_UNHANDLED(handled = false) |
| + IPC_END_MESSAGE_MAP() |
| + |
| + return handled; |
| +} |
| + |
| +void PepperWebContentsObserver::OnPepperStartsPlayback(int32_t pp_instance) { |
| + DCHECK_EQ(players_map_.count(pp_instance), 1u); |
| + |
| + if (active_players_.count(pp_instance)) |
| + // Only add the player into MediaSession on the first time it |
| + // starts playback. |
| + return; |
| + |
| + media_session_->AddPlayer(players_map_[pp_instance].get(), 0, |
| + MediaSession::Type::Content); |
| + active_players_.insert(pp_instance); |
| +} |
| + |
| +void PepperWebContentsObserver::OnPepperStopsPlayback(int32_t pp_instance) { |
| +} |
|
mlamouri (slow - plz ping)
2016/06/24 15:33:32
Why do you do nothing here? Actually, why does cre
Zhiqiang Zhang (Slow)
2016/06/24 17:43:21
I was thinking letting one flash join MediaSession
|
| + |
| +} // namespace content |