diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/testing/LegacyMockCDM.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/testing/LegacyMockCDM.cpp')
-rw-r--r-- | Source/WebCore/testing/LegacyMockCDM.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/Source/WebCore/testing/LegacyMockCDM.cpp b/Source/WebCore/testing/LegacyMockCDM.cpp new file mode 100644 index 000000000..b1a56aa21 --- /dev/null +++ b/Source/WebCore/testing/LegacyMockCDM.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2013 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "LegacyMockCDM.h" + +#if ENABLE(LEGACY_ENCRYPTED_MEDIA) + +#include "LegacyCDM.h" +#include "LegacyCDMSession.h" +#include "WebKitMediaKeyError.h" +#include <runtime/JSCInlines.h> +#include <runtime/TypedArrayInlines.h> +#include <runtime/Uint8Array.h> + +namespace WebCore { + +class MockCDMSession : public CDMSession { +public: + MockCDMSession(CDMSessionClient*); + virtual ~MockCDMSession() { } + + void setClient(CDMSessionClient* client) override { m_client = client; } + const String& sessionId() const override { return m_sessionId; } + RefPtr<Uint8Array> generateKeyRequest(const String& mimeType, Uint8Array* initData, String& destinationURL, unsigned short& errorCode, uint32_t& systemCode) override; + void releaseKeys() override; + bool update(Uint8Array*, RefPtr<Uint8Array>& nextMessage, unsigned short& errorCode, uint32_t& systemCode) override; + +protected: + CDMSessionClient* m_client; + String m_sessionId; +}; + +bool MockCDM::supportsKeySystem(const String& keySystem) +{ + return equalLettersIgnoringASCIICase(keySystem, "com.webcore.mock"); +} + +bool MockCDM::supportsKeySystemAndMimeType(const String& keySystem, const String& mimeType) +{ + if (!supportsKeySystem(keySystem)) + return false; + + return equalLettersIgnoringASCIICase(mimeType, "video/mock"); +} + +bool MockCDM::supportsMIMEType(const String& mimeType) +{ + return equalLettersIgnoringASCIICase(mimeType, "video/mock"); +} + +std::unique_ptr<CDMSession> MockCDM::createSession(CDMSessionClient* client) +{ + return std::make_unique<MockCDMSession>(client); +} + +static Uint8Array* initDataPrefix() +{ + const unsigned char prefixData[] = { 'm', 'o', 'c', 'k' }; + static Uint8Array* prefix = Uint8Array::create(prefixData, WTF_ARRAY_LENGTH(prefixData)).leakRef(); + + return prefix; +} + +static Uint8Array* keyPrefix() +{ + static const unsigned char prefixData[] = {'k', 'e', 'y'}; + static Uint8Array* prefix = Uint8Array::create(prefixData, WTF_ARRAY_LENGTH(prefixData)).leakRef(); + + return prefix; +} + +static Uint8Array* keyRequest() +{ + static const unsigned char requestData[] = {'r', 'e', 'q', 'u', 'e', 's', 't'}; + static Uint8Array* request = Uint8Array::create(requestData, WTF_ARRAY_LENGTH(requestData)).leakRef(); + + return request; +} + +static String generateSessionId() +{ + static int monotonicallyIncreasingSessionId = 0; + return String::number(monotonicallyIncreasingSessionId++); +} + +MockCDMSession::MockCDMSession(CDMSessionClient* client) + : m_client(client) + , m_sessionId(generateSessionId()) +{ +} + +RefPtr<Uint8Array> MockCDMSession::generateKeyRequest(const String&, Uint8Array* initData, String&, unsigned short& errorCode, uint32_t&) +{ + for (unsigned i = 0; i < initDataPrefix()->length(); ++i) { + if (!initData || i >= initData->length() || initData->item(i) != initDataPrefix()->item(i)) { + errorCode = WebKitMediaKeyError::MEDIA_KEYERR_UNKNOWN; + return nullptr; + } + } + return keyRequest(); +} + +void MockCDMSession::releaseKeys() +{ + // no-op +} + +bool MockCDMSession::update(Uint8Array* key, RefPtr<Uint8Array>&, unsigned short& errorCode, uint32_t&) +{ + for (unsigned i = 0; i < keyPrefix()->length(); ++i) { + if (i >= key->length() || key->item(i) != keyPrefix()->item(i)) { + errorCode = WebKitMediaKeyError::MEDIA_KEYERR_CLIENT; + return false; + } + } + return true; +} + +} + +#endif // ENABLE(LEGACY_ENCRYPTED_MEDIA) |