Chromium Code Reviews| Index: content/browser/media/session/pepper_web_contents_observer.cc |
| diff --git a/content/browser/media/session/pepper_web_contents_observer.cc b/content/browser/media/session/pepper_web_contents_observer.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b1ccc01d6d0345256fd803756035d082a42a77a3 |
| --- /dev/null |
| +++ b/content/browser/media/session/pepper_web_contents_observer.cc |
| @@ -0,0 +1,74 @@ |
| +// 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_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_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) {} |
| + |
| +PepperWebContentsObserver::~PepperWebContentsObserver() = default; |
| + |
| +void PepperWebContentsObserver::WebContentsDestroyed() { |
| + for (auto& instance_player : players_map_) { |
| + OnPepperStopsPlayback(instance_player.first); |
| + } |
| +} |
| + |
| +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::PepperInstanceCreated(int32_t pp_instance) {} |
| + |
| +void PepperWebContentsObserver::PepperInstanceDeleted(int32_t pp_instance) { |
| + OnPepperStopsPlayback(pp_instance); |
| +} |
| + |
| +void PepperWebContentsObserver::OnPepperStartsPlayback(int32_t pp_instance) { |
| + if (players_map_.count(pp_instance)) |
| + return; |
| + |
| + players_map_[pp_instance].reset(new PepperPlayerDelegate(this, pp_instance)); |
| + MediaSession::Get(web_contents())->AddPlayer( |
| + players_map_[pp_instance].get(), 0, MediaSession::Type::Content); |
| +} |
| + |
| +void PepperWebContentsObserver::OnPepperStopsPlayback(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 (players_map_.count(pp_instance)) { |
| + MediaSession::Get(web_contents())->RemovePlayer( |
| + players_map_[pp_instance].get(), 0); |
| + } |
| + |
| + players_map_.erase(pp_instance); |
|
jochen (gone - plz use gerrit)
2016/06/27 11:47:11
why is this not in the previous if?
Zhiqiang Zhang (Slow)
2016/06/28 18:53:24
Sorry, this is code in an old patch. Fixed.
|
| +} |
| + |
| +} // namespace content |