| Index: third_party/WebKit/Source/modules/mediasession/MediaSession.cpp
|
| diff --git a/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp b/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp
|
| index 90b46c96e19edb56576e700466ac42b645d688cf..70f4bb5b66227d2e7340c65d7a9cbb526b7c9899 100644
|
| --- a/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp
|
| +++ b/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp
|
| @@ -4,12 +4,11 @@
|
|
|
| #include "modules/mediasession/MediaSession.h"
|
|
|
| +#include "bindings/modules/v8/MediaSessionActionHandler.h"
|
| #include "core/dom/Document.h"
|
| #include "core/dom/DocumentUserGestureToken.h"
|
| #include "core/dom/ExecutionContext.h"
|
| -#include "core/events/Event.h"
|
| #include "core/frame/LocalFrame.h"
|
| -#include "modules/EventTargetModules.h"
|
| #include "modules/mediasession/MediaMetadata.h"
|
| #include "modules/mediasession/MediaMetadataSanitizer.h"
|
| #include "platform/UserGestureIndicator.h"
|
| @@ -23,39 +22,49 @@ namespace {
|
|
|
| using ::blink::mojom::blink::MediaSessionAction;
|
|
|
| -const AtomicString& mojomActionToEventName(MediaSessionAction action) {
|
| +const AtomicString& mojomActionToActionName(MediaSessionAction action) {
|
| + DEFINE_STATIC_LOCAL(const AtomicString, playActionName, ("play"));
|
| + DEFINE_STATIC_LOCAL(const AtomicString, pauseActionName, ("pause"));
|
| + DEFINE_STATIC_LOCAL(const AtomicString, previousTrackActionName,
|
| + ("previoustrack"));
|
| + DEFINE_STATIC_LOCAL(const AtomicString, nextTrackActionName, ("nexttrack"));
|
| + DEFINE_STATIC_LOCAL(const AtomicString, seekBackwardActionName,
|
| + ("seekbackward"));
|
| + DEFINE_STATIC_LOCAL(const AtomicString, seekForwardActionName,
|
| + ("seekforward"));
|
| +
|
| switch (action) {
|
| case MediaSessionAction::PLAY:
|
| - return EventTypeNames::play;
|
| + return playActionName;
|
| case MediaSessionAction::PAUSE:
|
| - return EventTypeNames::pause;
|
| + return pauseActionName;
|
| case MediaSessionAction::PREVIOUS_TRACK:
|
| - return EventTypeNames::previoustrack;
|
| + return previousTrackActionName;
|
| case MediaSessionAction::NEXT_TRACK:
|
| - return EventTypeNames::nexttrack;
|
| + return nextTrackActionName;
|
| case MediaSessionAction::SEEK_BACKWARD:
|
| - return EventTypeNames::seekbackward;
|
| + return seekBackwardActionName;
|
| case MediaSessionAction::SEEK_FORWARD:
|
| - return EventTypeNames::seekforward;
|
| + return seekForwardActionName;
|
| default:
|
| NOTREACHED();
|
| }
|
| return WTF::emptyAtom;
|
| }
|
|
|
| -WTF::Optional<MediaSessionAction> eventNameToMojomAction(
|
| - const AtomicString& eventName) {
|
| - if (EventTypeNames::play == eventName)
|
| +WTF::Optional<MediaSessionAction> actionNameToMojomAction(
|
| + const String& actionName) {
|
| + if ("play" == actionName)
|
| return MediaSessionAction::PLAY;
|
| - if (EventTypeNames::pause == eventName)
|
| + if ("pause" == actionName)
|
| return MediaSessionAction::PAUSE;
|
| - if (EventTypeNames::previoustrack == eventName)
|
| + if ("previoustrack" == actionName)
|
| return MediaSessionAction::PREVIOUS_TRACK;
|
| - if (EventTypeNames::nexttrack == eventName)
|
| + if ("nexttrack" == actionName)
|
| return MediaSessionAction::NEXT_TRACK;
|
| - if (EventTypeNames::seekbackward == eventName)
|
| + if ("seekbackward" == actionName)
|
| return MediaSessionAction::SEEK_BACKWARD;
|
| - if (EventTypeNames::seekforward == eventName)
|
| + if ("seekforward" == actionName)
|
| return MediaSessionAction::SEEK_FORWARD;
|
|
|
| NOTREACHED();
|
| @@ -140,12 +149,43 @@ void MediaSession::onMetadataChanged() {
|
| m_metadata, getExecutionContext()));
|
| }
|
|
|
| -const WTF::AtomicString& MediaSession::interfaceName() const {
|
| - return EventTargetNames::MediaSession;
|
| +void MediaSession::setActionHandler(const String& action,
|
| + MediaSessionActionHandler* handler) {
|
| + if (handler) {
|
| + auto addResult = m_actionHandlers.set(
|
| + action, TraceWrapperMember<MediaSessionActionHandler>(this, handler));
|
| +
|
| + if (!addResult.isNewEntry)
|
| + return;
|
| +
|
| + notifyActionChange(action, ActionChangeType::ActionEnabled);
|
| + } else {
|
| + if (m_actionHandlers.find(action) == m_actionHandlers.end())
|
| + return;
|
| +
|
| + m_actionHandlers.remove(action);
|
| +
|
| + notifyActionChange(action, ActionChangeType::ActionDisabled);
|
| + }
|
| }
|
|
|
| -ExecutionContext* MediaSession::getExecutionContext() const {
|
| - return ContextClient::getExecutionContext();
|
| +void MediaSession::notifyActionChange(const String& action,
|
| + ActionChangeType type) {
|
| + mojom::blink::MediaSessionService* service = getService();
|
| + if (!service)
|
| + return;
|
| +
|
| + auto mojomAction = actionNameToMojomAction(action);
|
| + DCHECK(mojomAction.has_value());
|
| +
|
| + switch (type) {
|
| + case ActionChangeType::ActionEnabled:
|
| + service->EnableAction(mojomAction.value());
|
| + break;
|
| + case ActionChangeType::ActionDisabled:
|
| + service->DisableAction(mojomAction.value());
|
| + break;
|
| + }
|
| }
|
|
|
| mojom::blink::MediaSessionService* MediaSession::getService() {
|
| @@ -171,43 +211,36 @@ mojom::blink::MediaSessionService* MediaSession::getService() {
|
| return m_service.get();
|
| }
|
|
|
| -bool MediaSession::addEventListenerInternal(
|
| - const AtomicString& eventType,
|
| - EventListener* listener,
|
| - const AddEventListenerOptionsResolved& options) {
|
| - if (mojom::blink::MediaSessionService* service = getService()) {
|
| - auto mojomAction = eventNameToMojomAction(eventType);
|
| - DCHECK(mojomAction.has_value());
|
| - service->EnableAction(mojomAction.value());
|
| - }
|
| - return EventTarget::addEventListenerInternal(eventType, listener, options);
|
| -}
|
| -
|
| -bool MediaSession::removeEventListenerInternal(
|
| - const AtomicString& eventType,
|
| - const EventListener* listener,
|
| - const EventListenerOptions& options) {
|
| - if (mojom::blink::MediaSessionService* service = getService()) {
|
| - auto mojomAction = eventNameToMojomAction(eventType);
|
| - DCHECK(mojomAction.has_value());
|
| - service->DisableAction(mojomAction.value());
|
| - }
|
| - return EventTarget::removeEventListenerInternal(eventType, listener, options);
|
| -}
|
| -
|
| void MediaSession::DidReceiveAction(
|
| blink::mojom::blink::MediaSessionAction action) {
|
| DCHECK(getExecutionContext()->isDocument());
|
| Document* document = toDocument(getExecutionContext());
|
| UserGestureIndicator gestureIndicator(
|
| DocumentUserGestureToken::create(document));
|
| - dispatchEvent(Event::create(mojomActionToEventName(action)));
|
| +
|
| + auto iter = m_actionHandlers.find(mojomActionToActionName(action));
|
| + if (iter == m_actionHandlers.end())
|
| + return;
|
| +
|
| + iter->value->call(this);
|
| +}
|
| +
|
| +void MediaSession::setV8ReferencesForHandlers(
|
| + v8::Isolate* isolate,
|
| + const v8::Persistent<v8::Object>& wrapper) {
|
| + for (auto handler : m_actionHandlers.values())
|
| + handler->setWrapperReference(isolate, wrapper);
|
| }
|
|
|
| DEFINE_TRACE(MediaSession) {
|
| visitor->trace(m_metadata);
|
| - EventTargetWithInlineData::trace(visitor);
|
| + visitor->trace(m_actionHandlers);
|
| ContextClient::trace(visitor);
|
| }
|
|
|
| +DEFINE_TRACE_WRAPPERS(MediaSession) {
|
| + for (auto handler : m_actionHandlers.values())
|
| + visitor->traceWrappers(handler);
|
| +}
|
| +
|
| } // namespace blink
|
|
|