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
3 // found in the LICENSE file.
5 #ifndef HTMLMediaElementEncryptedMedia_h
6 #define HTMLMediaElementEncryptedMedia_h
8 #include "core/EventTypeNames.h"
9 #include "core/dom/DOMTypedArray.h"
10 #include "core/events/EventTarget.h"
11 #include "platform/Supplementable.h"
12 #include "platform/graphics/media/MediaPlayer.h"
13 #include "platform/heap/Handle.h"
14 #include "public/platform/WebMediaPlayerClient.h"
19 class HTMLMediaElement;
24 class HTMLMediaElementEncryptedMedia final : public NoBaseWillBeGarbageCollected<HTMLMediaElementEncryptedMedia>, public WillBeHeapSupplement<HTMLMediaElement> {
25 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(HTMLMediaElementEncryptedMedia);
26 DECLARE_EMPTY_VIRTUAL_DESTRUCTOR_WILL_BE_REMOVED(HTMLMediaElementEncryptedMedia);
28 // encrypted media extensions (v0.1b)
29 static void webkitGenerateKeyRequest(HTMLMediaElement&, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionState&);
30 static void webkitGenerateKeyRequest(HTMLMediaElement&, const String& keySystem, ExceptionState&);
31 static void webkitAddKey(HTMLMediaElement&, const String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> initData, const String& sessionId, ExceptionState&);
32 static void webkitAddKey(HTMLMediaElement&, const String& keySystem, PassRefPtr<DOMUint8Array> key, ExceptionState&);
33 static void webkitCancelKeyRequest(HTMLMediaElement&, const String& keySystem, const String& sessionId, ExceptionState&);
35 DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(webkitkeyadded);
36 DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(webkitkeyerror);
37 DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(webkitkeymessage);
38 DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(webkitneedkey);
40 // encrypted media extensions (WD)
41 static MediaKeys* mediaKeys(HTMLMediaElement&);
42 static ScriptPromise setMediaKeys(ScriptState*, HTMLMediaElement&, MediaKeys*);
43 DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(encrypted);
45 static void keyAdded(HTMLMediaElement&, const String& keySystem, const String& sessionId);
46 static void keyError(HTMLMediaElement&, const String& keySystem, const String& sessionId, WebMediaPlayerClient::MediaKeyErrorCode, unsigned short systemCode);
47 static void keyMessage(HTMLMediaElement&, const String& keySystem, const String& sessionId, const unsigned char* message, unsigned messageLength, const WebURL& defaultURL);
48 static void encrypted(HTMLMediaElement&, const String& initDataType, const unsigned char* initData, unsigned initDataLength);
49 static void playerDestroyed(HTMLMediaElement&);
50 static WebContentDecryptionModule* contentDecryptionModule(HTMLMediaElement&);
52 static HTMLMediaElementEncryptedMedia& from(HTMLMediaElement&);
53 static const char* supplementName();
55 virtual void trace(Visitor*) override;
58 friend class SetMediaKeysHandler;
60 HTMLMediaElementEncryptedMedia();
61 void generateKeyRequest(WebMediaPlayer*, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionState&);
62 void addKey(WebMediaPlayer*, const String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> initData, const String& sessionId, ExceptionState&);
63 void cancelKeyRequest(WebMediaPlayer*, const String& keySystem, const String& sessionId, ExceptionState&);
66 bool setAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener>);
67 EventListener* getAttributeEventListener(const AtomicString& eventType);
69 // Currently we have both EME v0.1b and EME WD implemented in media element.
70 // But we do not want to support both at the same time. The one used first
71 // will be supported. Use |m_emeMode| to track this selection.
72 // FIXME: Remove EmeMode once EME v0.1b support is removed. See crbug.com/249976.
73 enum EmeMode { EmeModeNotSelected, EmeModePrefixed, EmeModeUnprefixed };
75 // check (and set if necessary) the encrypted media extensions (EME) mode
76 // (v0.1b or WD). Returns whether the mode is allowed and successfully set.
77 bool setEmeMode(EmeMode);
79 WebContentDecryptionModule* contentDecryptionModule();
83 PersistentWillBeMember<MediaKeys> m_mediaKeys;