Add a "supportedConfiguration" dictionary to MediaCapabilitiesDecodingInfo and MediaC...
[WebKit-https.git] / Source / WebCore / testing / LegacyMockCDM.cpp
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "LegacyMockCDM.h"
28
29 #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
30
31 #include "LegacyCDM.h"
32 #include "LegacyCDMSession.h"
33 #include "WebKitMediaKeyError.h"
34 #include <JavaScriptCore/JSCInlines.h>
35 #include <JavaScriptCore/TypedArrayInlines.h>
36 #include <JavaScriptCore/Uint8Array.h>
37
38 namespace WebCore {
39
40 class MockCDMSession : public LegacyCDMSession {
41 public:
42     MockCDMSession(LegacyCDMSessionClient*);
43     virtual ~MockCDMSession() = default;
44
45     void setClient(LegacyCDMSessionClient* client) override { m_client = client; }
46     const String& sessionId() const override { return m_sessionId; }
47     RefPtr<Uint8Array> generateKeyRequest(const String& mimeType, Uint8Array* initData, String& destinationURL, unsigned short& errorCode, uint32_t& systemCode) override;
48     void releaseKeys() override;
49     bool update(Uint8Array*, RefPtr<Uint8Array>& nextMessage, unsigned short& errorCode, uint32_t& systemCode) override;
50
51 protected:
52     LegacyCDMSessionClient* m_client;
53     String m_sessionId;
54 };
55
56 bool LegacyMockCDM::supportsKeySystem(const String& keySystem)
57 {
58     return equalLettersIgnoringASCIICase(keySystem, "com.webcore.mock");
59 }
60
61 bool LegacyMockCDM::supportsKeySystemAndMimeType(const String& keySystem, const String& mimeType)
62 {
63     if (!supportsKeySystem(keySystem))
64         return false;
65
66     return equalLettersIgnoringASCIICase(mimeType, "video/mock");
67 }
68
69 bool LegacyMockCDM::supportsMIMEType(const String& mimeType)
70 {
71     return equalLettersIgnoringASCIICase(mimeType, "video/mock");
72 }
73
74 std::unique_ptr<LegacyCDMSession> LegacyMockCDM::createSession(LegacyCDMSessionClient* client)
75 {
76     return std::make_unique<MockCDMSession>(client);
77 }
78
79 static Uint8Array* initDataPrefix()
80 {
81     const unsigned char prefixData[] = { 'm', 'o', 'c', 'k' };
82     static Uint8Array& prefix { Uint8Array::create(prefixData, WTF_ARRAY_LENGTH(prefixData)).leakRef() };
83
84     return &prefix;
85 }
86
87 static Uint8Array* keyPrefix()
88 {
89     static const unsigned char prefixData[] = {'k', 'e', 'y'};
90     static Uint8Array& prefix { Uint8Array::create(prefixData, WTF_ARRAY_LENGTH(prefixData)).leakRef() };
91
92     return &prefix;
93 }
94
95 static Uint8Array* keyRequest()
96 {
97     static const unsigned char requestData[] = {'r', 'e', 'q', 'u', 'e', 's', 't'};
98     static Uint8Array& request { Uint8Array::create(requestData, WTF_ARRAY_LENGTH(requestData)).leakRef() };
99
100     return &request;
101 }
102
103 static String generateSessionId()
104 {
105     static int monotonicallyIncreasingSessionId = 0;
106     return String::number(monotonicallyIncreasingSessionId++);
107 }
108
109 MockCDMSession::MockCDMSession(LegacyCDMSessionClient* client)
110     : m_client(client)
111     , m_sessionId(generateSessionId())
112 {
113 }
114
115 RefPtr<Uint8Array> MockCDMSession::generateKeyRequest(const String&, Uint8Array* initData, String&, unsigned short& errorCode, uint32_t&)
116 {
117     for (unsigned i = 0; i < initDataPrefix()->length(); ++i) {
118         if (!initData || i >= initData->length() || initData->item(i) != initDataPrefix()->item(i)) {
119             errorCode = WebKitMediaKeyError::MEDIA_KEYERR_UNKNOWN;
120             return nullptr;
121         }
122     }
123     return keyRequest();
124 }
125
126 void MockCDMSession::releaseKeys()
127 {
128     // no-op
129 }
130
131 bool MockCDMSession::update(Uint8Array* key, RefPtr<Uint8Array>&, unsigned short& errorCode, uint32_t&)
132 {
133     for (unsigned i = 0; i < keyPrefix()->length(); ++i) {
134         if (i >= key->length() || key->item(i) != keyPrefix()->item(i)) {
135             errorCode = WebKitMediaKeyError::MEDIA_KEYERR_CLIENT;
136             return false;
137         }
138     }
139     return true;
140 }
141
142 }
143
144 #endif // ENABLE(LEGACY_ENCRYPTED_MEDIA)