1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// found in the LICENSE file.
4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#ifndef HTMLMediaElementEncryptedMedia_h
6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#define HTMLMediaElementEncryptedMedia_h
7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
8d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "modules/EventTargetModules.h"
9d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/Supplementable.h"
10d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/graphics/media/MediaPlayer.h"
1110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "platform/heap/Handle.h"
12d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "public/platform/WebMediaPlayerClient.h"
13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/Forward.h"
14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
15d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)namespace WebCore {
16d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
17d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class ExceptionState;
18d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class HTMLMediaElement;
19d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class MediaKeys;
20d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
21323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)class HTMLMediaElementEncryptedMedia FINAL : public NoBaseWillBeGarbageCollected<HTMLMediaElementEncryptedMedia>, public WillBeHeapSupplement<HTMLMediaElement> {
22323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(HTMLMediaElementEncryptedMedia);
23323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    DECLARE_EMPTY_VIRTUAL_DESTRUCTOR_WILL_BE_REMOVED(HTMLMediaElementEncryptedMedia);
24d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)public:
25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // encrypted media extensions (v0.1b)
26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static void webkitGenerateKeyRequest(HTMLMediaElement&, const String& keySystem, PassRefPtr<Uint8Array> initData, ExceptionState&);
27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static void webkitGenerateKeyRequest(HTMLMediaElement&, const String& keySystem, ExceptionState&);
28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static void webkitAddKey(HTMLMediaElement&, const String& keySystem, PassRefPtr<Uint8Array> key, PassRefPtr<Uint8Array> initData, const String& sessionId, ExceptionState&);
29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static void webkitAddKey(HTMLMediaElement&, const String& keySystem, PassRefPtr<Uint8Array> key, ExceptionState&);
30d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static void webkitCancelKeyRequest(HTMLMediaElement&, const String& keySystem, const String& sessionId, ExceptionState&);
31d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(webkitkeyadded);
33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(webkitkeyerror);
34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(webkitkeymessage);
35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(webkitneedkey);
36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // encrypted media extensions (WD)
38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static MediaKeys* mediaKeys(HTMLMediaElement&);
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static void setMediaKeys(HTMLMediaElement&, MediaKeys*, ExceptionState&);
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(needkey);
41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static void keyAdded(HTMLMediaElement&, const String& keySystem, const String& sessionId);
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static void keyError(HTMLMediaElement&, const String& keySystem, const String& sessionId, blink::WebMediaPlayerClient::MediaKeyErrorCode, unsigned short systemCode);
44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static void keyMessage(HTMLMediaElement&, const String& keySystem, const String& sessionId, const unsigned char* message, unsigned messageLength, const blink::WebURL& defaultURL);
45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static void keyNeeded(HTMLMediaElement&, const String& contentType, const unsigned char* initData, unsigned initDataLength);
46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static void playerDestroyed(HTMLMediaElement&);
47d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static blink::WebContentDecryptionModule* contentDecryptionModule(HTMLMediaElement&);
48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static HTMLMediaElementEncryptedMedia& from(HTMLMediaElement&);
50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char* supplementName();
51d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
52323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
53a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)private:
55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    HTMLMediaElementEncryptedMedia();
56d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void generateKeyRequest(blink::WebMediaPlayer*, const String& keySystem, PassRefPtr<Uint8Array> initData, ExceptionState&);
57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void addKey(blink::WebMediaPlayer*, const String& keySystem, PassRefPtr<Uint8Array> key, PassRefPtr<Uint8Array> initData, const String& sessionId, ExceptionState&);
58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void cancelKeyRequest(blink::WebMediaPlayer*, const String& keySystem, const String& sessionId, ExceptionState&);
59d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // EventTarget
61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool setAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener>);
62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    EventListener* getAttributeEventListener(const AtomicString& eventType);
63d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Currently we have both EME v0.1b and EME WD implemented in media element.
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // But we do not want to support both at the same time. The one used first
66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // will be supported. Use |m_emeMode| to track this selection.
67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME: Remove EmeMode once EME v0.1b support is removed. See crbug.com/249976.
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    enum EmeMode { EmeModeNotSelected, EmeModePrefixed, EmeModeUnprefixed };
69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // check (and set if necessary) the encrypted media extensions (EME) mode
71d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // (v0.1b or WD). Returns whether the mode is allowed and successfully set.
72d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool setEmeMode(EmeMode, ExceptionState&);
73d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
74d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    blink::WebContentDecryptionModule* contentDecryptionModule();
75d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setMediaKeysInternal(HTMLMediaElement&, MediaKeys*);
76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    EmeMode m_emeMode;
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
79f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    PersistentWillBeMember<MediaKeys> m_mediaKeys;
80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
84d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif
85