Commit 64f1994c authored by Nate Chapin's avatar Nate Chapin Committed by Commit Bot

Merge NavigationMediaSession and MediaSession

Bug: 1147612
Change-Id: I52ce20f6446c813bd7f51ba8f051930590a0add4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2529702
Auto-Submit: Nate Chapin <japhet@chromium.org>
Reviewed-by: default avatarBecca Hughes <beccahughes@chromium.org>
Commit-Queue: Nate Chapin <japhet@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827400}
parent 80ca6114
......@@ -12,8 +12,6 @@ blink_modules_sources("mediasession") {
"media_metadata_sanitizer.h",
"media_session.cc",
"media_session.h",
"navigator_media_session.cc",
"navigator_media_session.h",
"type_converters.cc",
"type_converters.h",
]
......
......@@ -13,9 +13,9 @@
#include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_action_details.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_action_handler.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_seek_to_action_details.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/navigator.h"
#include "third_party/blink/renderer/core/frame/web_feature.h"
#include "third_party/blink/renderer/modules/mediasession/media_metadata.h"
#include "third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.h"
......@@ -125,11 +125,23 @@ mojom::blink::MediaSessionPlaybackState StringToMediaSessionPlaybackState(
} // anonymous namespace
MediaSession::MediaSession(ExecutionContext* execution_context)
: ExecutionContextClient(execution_context),
const char MediaSession::kSupplementName[] = "MediaSession";
MediaSession* MediaSession::mediaSession(Navigator& navigator) {
MediaSession* supplement =
Supplement<Navigator>::From<MediaSession>(navigator);
if (!supplement) {
supplement = MakeGarbageCollected<MediaSession>(navigator);
ProvideTo(navigator, supplement);
}
return supplement;
}
MediaSession::MediaSession(Navigator& navigator)
: Supplement<Navigator>(navigator),
clock_(base::DefaultTickClock::GetInstance()),
playback_state_(mojom::blink::MediaSessionPlaybackState::NONE),
client_receiver_(this, execution_context) {}
client_receiver_(this, navigator.DomWindow()) {}
void MediaSession::setPlaybackState(const String& playback_state) {
playback_state_ = StringToMediaSessionPlaybackState(playback_state);
......@@ -166,21 +178,22 @@ void MediaSession::OnMetadataChanged() {
return;
service->SetMetadata(MediaMetadataSanitizer::SanitizeAndConvertToMojo(
metadata_, GetExecutionContext()));
metadata_, GetSupplementable()->DomWindow()));
}
void MediaSession::setActionHandler(const String& action,
V8MediaSessionActionHandler* handler,
ExceptionState& exception_state) {
if (action == "skipad") {
if (!RuntimeEnabledFeatures::SkipAdEnabled(GetExecutionContext())) {
LocalDOMWindow* window = GetSupplementable()->DomWindow();
if (!RuntimeEnabledFeatures::SkipAdEnabled(window)) {
exception_state.ThrowTypeError(
"The provided value 'skipad' is not a valid enum "
"value of type MediaSessionAction.");
return;
}
UseCounter::Count(GetExecutionContext(), WebFeature::kMediaSessionSkipAd);
UseCounter::Count(window, WebFeature::kMediaSessionSkipAd);
}
if (handler) {
......@@ -324,13 +337,13 @@ void MediaSession::RecalculatePositionState(bool was_set) {
mojom::blink::MediaSessionService* MediaSession::GetService() {
if (service_)
return service_.get();
if (!GetExecutionContext())
LocalDOMWindow* window = GetSupplementable()->DomWindow();
if (!window)
return nullptr;
// See https://bit.ly/2S0zRAS for task types.
auto task_runner =
GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI);
GetExecutionContext()->GetBrowserInterfaceBroker().GetInterface(
auto task_runner = window->GetTaskRunner(TaskType::kMiscPlatformAPI);
window->GetBrowserInterfaceBroker().GetInterface(
service_.BindNewPipeAndPassReceiver());
if (service_.get())
service_->SetClient(client_receiver_.BindNewPipeAndPassRemote(task_runner));
......@@ -341,10 +354,11 @@ mojom::blink::MediaSessionService* MediaSession::GetService() {
void MediaSession::DidReceiveAction(
media_session::mojom::blink::MediaSessionAction action,
mojom::blink::MediaSessionActionDetailsPtr details) {
if (!GetExecutionContext())
LocalDOMWindow* window = GetSupplementable()->DomWindow();
if (!window)
return;
LocalFrame::NotifyUserActivation(
To<LocalDOMWindow>(GetExecutionContext())->GetFrame(),
window->GetFrame(),
mojom::blink::UserActivationNotificationType::kInteraction);
auto& name = MojomActionToActionName(action);
......@@ -366,7 +380,7 @@ void MediaSession::Trace(Visitor* visitor) const {
visitor->Trace(metadata_);
visitor->Trace(action_handlers_);
ScriptWrappable::Trace(visitor);
ExecutionContextClient::Trace(visitor);
Supplement<Navigator>::Trace(visitor);
}
} // namespace blink
......@@ -8,12 +8,12 @@
#include <memory>
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/public/mojom/mediasession/media_session.mojom-blink.h"
#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_wrapper_mode.h"
#include "third_party/blink/renderer/platform/supplementable.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace base {
......@@ -22,20 +22,22 @@ class TickClock;
namespace blink {
class ExecutionContext;
class ExceptionState;
class MediaMetadata;
class MediaPositionState;
class Navigator;
class V8MediaSessionActionHandler;
class MODULES_EXPORT MediaSession final
: public ScriptWrappable,
public ExecutionContextClient,
public Supplement<Navigator>,
public blink::mojom::blink::MediaSessionClient {
DEFINE_WRAPPERTYPEINFO();
public:
explicit MediaSession(ExecutionContext*);
static const char kSupplementName[];
static MediaSession* mediaSession(Navigator&);
explicit MediaSession(Navigator&);
void setPlaybackState(const String&);
String playbackState();
......@@ -74,7 +76,7 @@ class MODULES_EXPORT MediaSession final
void DidReceiveAction(media_session::mojom::blink::MediaSessionAction,
mojom::blink::MediaSessionActionDetailsPtr) override;
// Returns null when the ExecutionContext is not document.
// Returns null if the associated window is detached.
mojom::blink::MediaSessionService* GetService();
const base::TickClock* clock_ = nullptr;
......
......@@ -56,7 +56,8 @@ class MediaSessionTest : public PageTestBase {
mock_service_ = std::make_unique<MockMediaSessionService>();
media_session_ = MakeGarbageCollected<MediaSession>(GetFrame().DomWindow());
media_session_ =
MediaSession::mediaSession(*GetFrame().DomWindow()->navigator());
media_session_->service_ = mock_service_->CreateRemoteAndBind();
media_session_->clock_ = &test_clock_;
}
......
// 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 "third_party/blink/renderer/modules/mediasession/navigator_media_session.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/modules/mediasession/media_session.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/supplementable.h"
namespace blink {
NavigatorMediaSession::NavigatorMediaSession(Navigator& navigator)
: Supplement<Navigator>(navigator) {}
void NavigatorMediaSession::Trace(Visitor* visitor) const {
visitor->Trace(session_);
Supplement<Navigator>::Trace(visitor);
}
const char NavigatorMediaSession::kSupplementName[] = "NavigatorMediaSession";
NavigatorMediaSession& NavigatorMediaSession::From(Navigator& navigator) {
NavigatorMediaSession* supplement =
Supplement<Navigator>::From<NavigatorMediaSession>(navigator);
if (!supplement) {
supplement = MakeGarbageCollected<NavigatorMediaSession>(navigator);
ProvideTo(navigator, supplement);
}
return *supplement;
}
MediaSession* NavigatorMediaSession::mediaSession(ScriptState* script_state,
Navigator& navigator) {
NavigatorMediaSession& self = NavigatorMediaSession::From(navigator);
if (!self.session_) {
self.session_ = MakeGarbageCollected<MediaSession>(
ExecutionContext::From(script_state));
}
return self.session_.Get();
}
} // namespace blink
// 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.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASESSION_NAVIGATOR_MEDIA_SESSION_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASESSION_NAVIGATOR_MEDIA_SESSION_H_
#include "third_party/blink/renderer/core/frame/navigator.h"
#include "third_party/blink/renderer/modules/mediasession/media_session.h"
#include "third_party/blink/renderer/platform/supplementable.h"
namespace blink {
class Navigator;
class ScriptState;
// Provides MediaSession as a supplement of Navigator as an attribute.
class NavigatorMediaSession final
: public GarbageCollected<NavigatorMediaSession>,
public Supplement<Navigator> {
public:
static const char kSupplementName[];
static NavigatorMediaSession& From(Navigator&);
static MediaSession* mediaSession(ScriptState*, Navigator&);
explicit NavigatorMediaSession(Navigator&);
void Trace(Visitor*) const override;
private:
// The MediaSession instance of this Navigator.
Member<MediaSession> session_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASESSION_NAVIGATOR_MEDIA_SESSION_H_
......@@ -6,8 +6,8 @@
[
Exposed=(Window),
ImplementedAs=NavigatorMediaSession,
ImplementedAs=MediaSession,
RuntimeEnabled=MediaSession
] partial interface Navigator {
[CallWith=ScriptState, SameObject] readonly attribute MediaSession mediaSession;
[SameObject] readonly attribute MediaSession mediaSession;
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment