mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
bc8ce42355
- Bug 1226200: Don't assume a TCPSocket has only one managee (and rename LoneManagedOrNull) r=jdm (aa2d0fcc14) - Bug 1227300, Part 1 - Add an alert notification component. r=MattN,wchen (37758ce9ff) - Bug 1230700. Make Notification::ShowInternal explicitly suppress the exception from GetPermissionInternal. r=smaug (9e288cf5ae) - Bug 1225336 - Add telemetry about web notification display/messages. r=wchen,kitcambridge p=vladan# Please enter the commit message for your changes. Lines starting (b2e481691a) - Bug 1219030 - Collect notification management telemetry. r=wchen,MattN; p=ally (c0ba425b4e) - Bug 1212611 - Use system notification for website notifications in Android. r=mfinkle (84985bcf01) - Bug 1227300, Part 2 - Implement showAlert. r=MattN,wchen (33eedc7e91) - Bug 1214305 - Part 0: Ensure site security service is initialized before trying to use DataStorage via IPC. (8bd73f43b0) - Bug 1137681 - Make user agent docshell overrides affect network requests. r=jduell (e8dabb8338) - Bug 1233245 - Propagate the interception information in the non-e10s case for all HTTP redirects, not just the internal ones; r=jdm (6922fddcf8) - Bug 1226444 - Use helper function to identify preloads. r=sicking (d110669f73) - Bug 1214305 - Part 1: Refactor the logic for querying whether a connection should go through a secure upgrade into NS_ShouldSecureUpgrade; r=mcmanus (2d04c78290) - Bug 1137681 - Per-tab user agent emulation. r=bz (4ff70db690) - Bug 1227300, Part 3 - Implement showAlert for the OS X alerts backend. r=mstange (5eb05d0728) - Bug 1227300, Part 4 - Implement showAlert for the libnotify alerts backend. r=karlt (0942fa2764) - Bug 1227300, Part 5 - Implement showAlert for the B2G alerts backend. r=mhenretty (e39581aea5) - Bug 1227300, Part 6 - Use showAlert to display web notifications. r=wchen (ab79eaa0c8) - domBug 1227300, Part 7 - Update test interfaces. a=testonly (387cb62772) - Bug 1214305 - Part 3: Add a nsIInterceptedChannel.secureUpgradedChannelURI helper; r=jdm (811d25bd58) - Bug 1214305 - Part 4: Use the secure upgraded channel URI in ServiceWorkerManager::PrepareFetchEvent; r=jdm (0c44bf527c) - Bug 1214305 - Part 5: Use the secure upgraded channel URI in FetchEventRunnable::Init; r=jdm (a30f239261) - Bug 1214305 - Part 6: Use a non-IPC redirect for synthesized upgraded responses to ensure the response URL is correctly propagated; r=mcmanus (8ba8a5728c) - Bug 1214305 - Part 7: Decide in the child process whether an intercepted channel should go through a secure upgrade; r=mcmanus (93e27decae) - Bug 1198397 - Add a test for interception of requests upgraded through the CSP upgrade-insecure-requests directive; r=jdm (21eb14eb34) - Bug 1214305 - Part 8: Enable secure upgrade service worker tests on e10s; r=jdm (c14f5fb504) - Bug 1214305 - Part 10: Clean up global DataStorage references in the child process; r=keeler (ef0b52d049) - Bug 1224771 - Close all web notifications when the originating tab is closed. r=wchen (da295b4ba7) - Bug 1214305 - Part 2: Refactor the logic for obtaining the secure upgraded URI into HttpBaseChannel; r=mcmanus (3346078285) - Bug 1237151 (part 1) - Remove ignored qualifiers in dom/media/gmp/. r=cpearce. (18134820a6) - Bug 1237151 (part 2) - Remove ignored qualifiers in WebRTC-relate code. r=jesup. (effe5bd694) - Bug 1118820 part 1 (style system part) - [css-grid] Implement the 'auto-fill' and 'auto-fit' keywords in the repeat() function. r=dholbert (5db1a577db) - Bug 1118820 part 2a - [css-grid] Add a LineNameMap class that lets us lookup line names with a dynamic number of 'repeat(auto-fill/auto-fit)' tracks taken into account. r=dholbert (3ecf4b53f0) - Bug 1118820 part 2b - [css-grid] Move the static functions FindLine/RFindLine/FindNamedLine into the LineNameMap class (idempotent patch). r=dholbert (efb12c594b) - Bug 1118820 part 2c+2d - [css-grid] Modify the LineNameMap::FindLine/RFindLine/FindNamedLine methods to take line names associated with 'repeat(auto-fill/auto-fit)' tracks into account. Instantiate and pass around a LineNameMap object instead of an array of line name arrays. r=dholbert (a3db750297) - Bug 1118820 part 3a - [css-grid] Modify TrackSizingFunctions to take a dynamic number of 'repeat(auto-fill/auto-fit)' tracks taking into account. r=dholbert (9aa6033332) - Bug 1118820 part 3b - [css-grid] Implement the CalculateRepeatFillCount method that calculates the number of 'repeat(auto-fill/auto-fit)' tracks to use for the given sizes. r=dholbert (cf75fab8a8) - Bug 1118820 part 4 - [css-grid] Provide the sizes to use for CalculateRepeatFillCount. r=dholbert (8184c00dba) - Bug 1118820 part 5 - [css-grid] Remove any empty 'repeat(auto-fit)' tracks at the end of its range and adjust affected grid area line numbers accordingly. r=dholbert (c02ba6a6e3) - Bug 1229165 - [css-grid] Reftests for min/max-width/height properties on the grid container. (725097f878) - Bug 1229999 - [css-grid] Reftest. (51b5bc9535) - Bug 1237151 (part 3) - Remove ignored qualifiers in all remaining code. r=froydnj. (69917ebbad) - more bits of Bug 1178892 - Split the profiler into Core & Gecko files (41bb127b9c) - Bug 1199841 - Restructure private browsing to remember status after OnStopRequest r=jdm (16c2c1044d) - Bug 1233845 - Report an interception error and cancel the HTTP channel when encountering a known topcrash situation. r=ehsan (5d08075110) - Bug 664163 - Fix Get(Local|Remote)(Address|Port) in HttpChannelChild. r=jduell (cbf70af4e8) - Bug 1229177 - Show the tracking protection shield for fetch and XHR requests. r=jduell (5833b3e872) - Bug 1220678 Don't crash when DivertToParent() is called on an intercepted channel. r=jdm (5d7ff6ecc8) - Bug 1220681 P1 Make HttpChannelChild::DivertToParent() work with synthetic responses. r=jdm (67715703ef) - Bug 1169819 Add browser chrome test to validate SW force refresh. r=ehsan (c0b6b3e874) - Bug 1220681 P2 Test synthetic responses that trigger downloads. r=ehsan (c701f3ddb1) - Bug 1220681 P3 Delay diversion on parent side until response head has been synthesized. r=jdm (7c697aacee) - Bug 1220681 P4 Automatically suspend the parent channel after synthesizing the response for diverison. r=jdm (27f31bcb35) - Bug 1220681 P5 Don't double suspend parent channel during synthesized divert to parent. r=jdm (62081d4b56) - Bug 1220681 P6 Use clients.claim() in browser_download.js to avoid worker unregister race. r=jdm (c8de291727) - Bug 1240161 - Remove "only-if-cached" from RequestCache; r=bkelly (283486f584) - Bug 1184550 - Add a mochitest for the Request constructor that tests that the body is set to used after being fetched and then fails on the second fetch with the same Request. r=bkelly (db4a967203) - Bug 1205495 - Correctly use the requests's body and redirect mode in reroute.js; r=nsm (a36a96624a) - Bug 1189656 - Fix fetch-request-fallback test paths. r=bkelly (366c884179) - Bug 1219085 - Import the fetch-request-redirect.https.html test from Blink; r=jdm (bf6b484d82) - Bug 1209081 - Part 1: Implement the "navigate" value for RequestMode; r=bkelly (a22f19d94b) - Bug 1209081 - Part 2: Upgrade the saved Requests in the DOM Cache to reflect the "navigate" RequestMode if they represent navigation content policy types; r=bkelly (60d1da23bb) - Bug 1219469 - Part 1: Revert the error reporting added in bug 1233845; r=jdm (dcc022b9d3) - Bug 1219469 - Part 2: Make HttpChannelParentListener be the controller; r=jdm,jduell (9c5f0dfbe0) - Bug 1229369 - Intercept redirected network fetches that have their request mode set to manual; r=jdm (fb21d86ed2)
361 lines
14 KiB
C++
361 lines
14 KiB
C++
/*
|
|
* Copyright 2013, Mozilla Foundation and contributors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef GMP_DECRYPTION_h_
|
|
#define GMP_DECRYPTION_h_
|
|
|
|
#include "gmp-platform.h"
|
|
|
|
class GMPStringList {
|
|
public:
|
|
virtual uint32_t Size() const = 0;
|
|
|
|
virtual void StringAt(uint32_t aIndex,
|
|
const char** aOutString, uint32_t* aOutLength) const = 0;
|
|
|
|
virtual ~GMPStringList() { }
|
|
};
|
|
|
|
class GMPEncryptedBufferMetadata {
|
|
public:
|
|
// Key ID to identify the decryption key.
|
|
virtual const uint8_t* KeyId() const = 0;
|
|
|
|
// Size (in bytes) of |KeyId()|.
|
|
virtual uint32_t KeyIdSize() const = 0;
|
|
|
|
// Initialization vector.
|
|
virtual const uint8_t* IV() const = 0;
|
|
|
|
// Size (in bytes) of |IV|.
|
|
virtual uint32_t IVSize() const = 0;
|
|
|
|
// Number of entries returned by ClearBytes() and CipherBytes().
|
|
virtual uint32_t NumSubsamples() const = 0;
|
|
|
|
virtual const uint16_t* ClearBytes() const = 0;
|
|
|
|
virtual const uint32_t* CipherBytes() const = 0;
|
|
|
|
virtual ~GMPEncryptedBufferMetadata() {}
|
|
|
|
// The set of MediaKeySession IDs associated with this decryption key in
|
|
// the current stream.
|
|
virtual const GMPStringList* SessionIds() const = 0;
|
|
};
|
|
|
|
class GMPBuffer {
|
|
public:
|
|
virtual uint32_t Id() const = 0;
|
|
virtual uint8_t* Data() = 0;
|
|
virtual uint32_t Size() const = 0;
|
|
virtual void Resize(uint32_t aSize) = 0;
|
|
virtual ~GMPBuffer() {}
|
|
};
|
|
|
|
// These match to the DOMException codes as per:
|
|
// http://www.w3.org/TR/dom/#domexception
|
|
enum GMPDOMException {
|
|
kGMPNoModificationAllowedError = 7,
|
|
kGMPNotFoundError = 8,
|
|
kGMPNotSupportedError = 9,
|
|
kGMPInvalidStateError = 11,
|
|
kGMPSyntaxError = 12,
|
|
kGMPInvalidModificationError = 13,
|
|
kGMPInvalidAccessError = 15,
|
|
kGMPSecurityError = 18,
|
|
kGMPAbortError = 20,
|
|
kGMPQuotaExceededError = 22,
|
|
kGMPTimeoutError = 23
|
|
};
|
|
|
|
enum GMPSessionMessageType {
|
|
kGMPLicenseRequest = 0,
|
|
kGMPLicenseRenewal = 1,
|
|
kGMPLicenseRelease = 2,
|
|
kGMPIndividualizationRequest = 3,
|
|
kGMPMessageInvalid = 4 // Must always be last.
|
|
};
|
|
|
|
enum GMPMediaKeyStatus {
|
|
kGMPUsable = 0,
|
|
kGMPExpired = 1,
|
|
kGMPOutputDownscaled = 2,
|
|
kGMPOutputNotAllowed = 3,
|
|
kGMPInternalError = 4,
|
|
kGMPUnknown = 5,
|
|
kGMPMediaKeyStatusInvalid = 6 // Must always be last.
|
|
};
|
|
|
|
// Time in milliseconds, as offset from epoch, 1 Jan 1970.
|
|
typedef int64_t GMPTimestamp;
|
|
|
|
// Capability definitions. The capabilities of the EME GMP are reported
|
|
// to Gecko by calling the GMPDecryptorCallback::SetCapabilities()
|
|
// callback and specifying the logical OR of the GMP_EME_CAP_* flags below.
|
|
//
|
|
// Note the DECRYPT and the DECRYPT_AND_DECODE are mutually exclusive;
|
|
// only one mode should be reported for each stream type, but different
|
|
// modes can be reported for different stream types.
|
|
//
|
|
// Note: Gecko does not currently support the caps changing at runtime.
|
|
// Set them once per plugin initialization, during the startup of
|
|
// the GMPDecryptor.
|
|
|
|
// Capability; CDM can decrypt encrypted buffers and return still
|
|
// compressed buffers back to Gecko for decompression there.
|
|
#define GMP_EME_CAP_DECRYPT_AUDIO (uint64_t(1) << 0)
|
|
#define GMP_EME_CAP_DECRYPT_VIDEO (uint64_t(1) << 1)
|
|
|
|
// Capability; CDM can decrypt and then decode encrypted buffers,
|
|
// and return decompressed samples to Gecko for playback.
|
|
#define GMP_EME_CAP_DECRYPT_AND_DECODE_AUDIO (uint64_t(1) << 2)
|
|
#define GMP_EME_CAP_DECRYPT_AND_DECODE_VIDEO (uint64_t(1) << 3)
|
|
|
|
// Callbacks to be called from the CDM. Threadsafe.
|
|
class GMPDecryptorCallback {
|
|
public:
|
|
|
|
// The GMPDecryptor should call this in response to a call to
|
|
// GMPDecryptor::CreateSession(). The GMP host calls CreateSession() when
|
|
// MediaKeySession.generateRequest() is called by JavaScript.
|
|
// After CreateSession() is called, the GMPDecryptor should call
|
|
// GMPDecryptorCallback::SetSessionId() to set the sessionId exposed to
|
|
// JavaScript on the MediaKeySession on which the generateRequest() was
|
|
// called. SetSessionId() must be called before
|
|
// GMPDecryptorCallback::SessionMessage() will work.
|
|
// aSessionId must be null terminated.
|
|
// Note: pass the aCreateSessionToken from the CreateSession() call,
|
|
// and then once the session has sent any messages required for the
|
|
// license request to be sent, then resolve the aPromiseId that was passed
|
|
// to GMPDecryptor::CreateSession().
|
|
// Note: GMPDecryptor::LoadSession() does *not* need to call SetSessionId()
|
|
// for GMPDecryptorCallback::SessionMessage() to work.
|
|
virtual void SetSessionId(uint32_t aCreateSessionToken,
|
|
const char* aSessionId,
|
|
uint32_t aSessionIdLength) = 0;
|
|
|
|
// Resolves a promise for a session loaded.
|
|
// Resolves to false if we don't have any session data stored for the given
|
|
// session ID.
|
|
// Must be called before SessionMessage().
|
|
virtual void ResolveLoadSessionPromise(uint32_t aPromiseId,
|
|
bool aSuccess) = 0;
|
|
|
|
// Called to resolve a specified promise with "undefined".
|
|
virtual void ResolvePromise(uint32_t aPromiseId) = 0;
|
|
|
|
// Called to reject a promise with a DOMException.
|
|
// aMessage is logged to the WebConsole.
|
|
// aMessage is optional, but if present must be null terminated.
|
|
virtual void RejectPromise(uint32_t aPromiseId,
|
|
GMPDOMException aException,
|
|
const char* aMessage,
|
|
uint32_t aMessageLength) = 0;
|
|
|
|
// Called by the CDM when it has a message for a session.
|
|
// Length parameters should not include null termination.
|
|
// aSessionId must be null terminated.
|
|
virtual void SessionMessage(const char* aSessionId,
|
|
uint32_t aSessionIdLength,
|
|
GMPSessionMessageType aMessageType,
|
|
const uint8_t* aMessage,
|
|
uint32_t aMessageLength) = 0;
|
|
|
|
// aSessionId must be null terminated.
|
|
virtual void ExpirationChange(const char* aSessionId,
|
|
uint32_t aSessionIdLength,
|
|
GMPTimestamp aExpiryTime) = 0;
|
|
|
|
// Called by the GMP when a session is closed. All file IO
|
|
// that a session requires should be complete before calling this.
|
|
// aSessionId must be null terminated.
|
|
virtual void SessionClosed(const char* aSessionId,
|
|
uint32_t aSessionIdLength) = 0;
|
|
|
|
// Called by the GMP when an error occurs in a session.
|
|
// aSessionId must be null terminated.
|
|
// aMessage is logged to the WebConsole.
|
|
// aMessage is optional, but if present must be null terminated.
|
|
virtual void SessionError(const char* aSessionId,
|
|
uint32_t aSessionIdLength,
|
|
GMPDOMException aException,
|
|
uint32_t aSystemCode,
|
|
const char* aMessage,
|
|
uint32_t aMessageLength) = 0;
|
|
|
|
// Notifies the status of a key. Gecko will not call into the CDM to decrypt
|
|
// or decode content encrypted with a key unless the CDM has marked it
|
|
// usable first. So a CDM *MUST* mark its usable keys as usable!
|
|
virtual void KeyStatusChanged(const char* aSessionId,
|
|
uint32_t aSessionIdLength,
|
|
const uint8_t* aKeyId,
|
|
uint32_t aKeyIdLength,
|
|
GMPMediaKeyStatus aStatus) = 0;
|
|
|
|
// The CDM must report its capabilites of this CDM. aCaps should be a
|
|
// logical OR of the GMP_EME_CAP_* flags. The CDM *MUST* call this
|
|
// function and report whether it can decrypt and/or decode. Without
|
|
// this, Gecko does not know how to use the CDM and will not send
|
|
// samples to the CDM to decrypt or decrypt-and-decode mode. Note a
|
|
// CDM cannot change modes once playback has begun.
|
|
virtual void SetCapabilities(uint64_t aCaps) = 0;
|
|
|
|
// Returns decrypted buffer to Gecko, or reports failure.
|
|
virtual void Decrypted(GMPBuffer* aBuffer, GMPErr aResult) = 0;
|
|
|
|
virtual ~GMPDecryptorCallback() {}
|
|
};
|
|
|
|
// Host interface, passed to GetAPIFunc(), with "decrypt".
|
|
class GMPDecryptorHost {
|
|
public:
|
|
virtual void GetSandboxVoucher(const uint8_t** aVoucher,
|
|
uint32_t* aVoucherLength) = 0;
|
|
|
|
virtual void GetPluginVoucher(const uint8_t** aVoucher,
|
|
uint32_t* aVoucherLength) = 0;
|
|
|
|
virtual ~GMPDecryptorHost() {}
|
|
};
|
|
|
|
enum GMPSessionType {
|
|
kGMPTemporySession = 0,
|
|
kGMPPersistentSession = 1,
|
|
kGMPSessionInvalid = 2 // Must always be last.
|
|
};
|
|
|
|
// Gecko supports the current GMPDecryptor version, and the previous.
|
|
#define GMP_API_DECRYPTOR "eme-decrypt-v8"
|
|
#define GMP_API_DECRYPTOR_BACKWARDS_COMPAT "eme-decrypt-v7"
|
|
|
|
// API exposed by plugin library to manage decryption sessions.
|
|
// When the Host requests this by calling GMPGetAPIFunc().
|
|
//
|
|
// API name macro: GMP_API_DECRYPTOR
|
|
// Host API: GMPDecryptorHost
|
|
class GMPDecryptor {
|
|
public:
|
|
|
|
// Sets the callback to use with the decryptor to return results
|
|
// to Gecko.
|
|
//
|
|
// The CDM must also call GMPDecryptorCallback::SetCapabilities()
|
|
// exactly once during start up, to inform Gecko whether to use the CDM
|
|
// in decrypt or decrypt-and-decode mode.
|
|
//
|
|
// Note: GMPDecryptorCallback::SetCapabilities() must be called before
|
|
// Gecko will send any samples for decryption to the GMP.
|
|
virtual void Init(GMPDecryptorCallback* aCallback) = 0;
|
|
|
|
// Initiates the creation of a session given |aType| and |aInitData|, and
|
|
// the generation of a license request message.
|
|
//
|
|
// This corresponds to a MediaKeySession.generateRequest() call in JS.
|
|
//
|
|
// The GMPDecryptor must do the following, in order, upon this method
|
|
// being called:
|
|
//
|
|
// 1. Generate a sessionId to expose to JS, and call
|
|
// GMPDecryptorCallback::SetSessionId(aCreateSessionToken, sessionId...)
|
|
// with the sessionId to be exposed to JS/EME on the MediaKeySession
|
|
// object on which generateRequest() was called, and then
|
|
// 2. send any messages to JS/EME required to generate a license request
|
|
// given the supplied initData, and then
|
|
// 3. generate a license request message, and send it to JS/EME, and then
|
|
// 4. call GMPDecryptorCallback::ResolvePromise().
|
|
//
|
|
// Note: GMPDecryptorCallback::SetSessionId(aCreateSessionToken, sessionId, ...)
|
|
// *must* be called before GMPDecryptorCallback::SendMessage(sessionId, ...)
|
|
// will work.
|
|
//
|
|
// If generating the request fails, reject aPromiseId by calling
|
|
// GMPDecryptorCallback::RejectPromise().
|
|
virtual void CreateSession(uint32_t aCreateSessionToken,
|
|
uint32_t aPromiseId,
|
|
const char* aInitDataType,
|
|
uint32_t aInitDataTypeSize,
|
|
const uint8_t* aInitData,
|
|
uint32_t aInitDataSize,
|
|
GMPSessionType aSessionType) = 0;
|
|
|
|
// Loads a previously loaded persistent session.
|
|
//
|
|
// This corresponds to a MediaKeySession.load() call in JS.
|
|
//
|
|
// The GMPDecryptor must do the following, in order, upon this method
|
|
// being called:
|
|
//
|
|
// 1. Send any messages to JS/EME, or read from storage, whatever is
|
|
// required to load the session, and then
|
|
// 2. if there is no session with the given sessionId loadable, call
|
|
// ResolveLoadSessionPromise(aPromiseId, false), otherwise
|
|
// 2. mark the session's keys as usable, and then
|
|
// 3. update the session's expiration, and then
|
|
// 4. call GMPDecryptorCallback::ResolveLoadSessionPromise(aPromiseId, true).
|
|
//
|
|
// If loading the session fails due to error, reject aPromiseId by calling
|
|
// GMPDecryptorCallback::RejectPromise().
|
|
virtual void LoadSession(uint32_t aPromiseId,
|
|
const char* aSessionId,
|
|
uint32_t aSessionIdLength) = 0;
|
|
|
|
// Updates the session with |aResponse|.
|
|
// This corresponds to a MediaKeySession.update() call in JS.
|
|
virtual void UpdateSession(uint32_t aPromiseId,
|
|
const char* aSessionId,
|
|
uint32_t aSessionIdLength,
|
|
const uint8_t* aResponse,
|
|
uint32_t aResponseSize) = 0;
|
|
|
|
// Releases the resources (keys) for the specified session.
|
|
// This corresponds to a MediaKeySession.close() call in JS.
|
|
virtual void CloseSession(uint32_t aPromiseId,
|
|
const char* aSessionId,
|
|
uint32_t aSessionIdLength) = 0;
|
|
|
|
// Removes the resources (keys) for the specified session.
|
|
// This corresponds to a MediaKeySession.remove() call in JS.
|
|
virtual void RemoveSession(uint32_t aPromiseId,
|
|
const char* aSessionId,
|
|
uint32_t aSessionIdLength) = 0;
|
|
|
|
// Resolve/reject promise on completion.
|
|
// This corresponds to a MediaKeySession.setServerCertificate() call in JS.
|
|
virtual void SetServerCertificate(uint32_t aPromiseId,
|
|
const uint8_t* aServerCert,
|
|
uint32_t aServerCertSize) = 0;
|
|
|
|
// Asynchronously decrypts aBuffer in place. When the decryption is
|
|
// complete, GMPDecryptor should write the decrypted data back into the
|
|
// same GMPBuffer object and return it to Gecko by calling Decrypted(),
|
|
// with the GMPNoErr successcode. If decryption fails, call Decrypted()
|
|
// with a failure code, and an error event will fire on the media element.
|
|
// Note: When Decrypted() is called and aBuffer is passed back, aBuffer
|
|
// is deleted. Don't forget to call Decrypted(), as otherwise aBuffer's
|
|
// memory will leak!
|
|
virtual void Decrypt(GMPBuffer* aBuffer,
|
|
GMPEncryptedBufferMetadata* aMetadata) = 0;
|
|
|
|
// Called when the decryption operations are complete.
|
|
// Do not call the GMPDecryptorCallback's functions after this is called.
|
|
virtual void DecryptingComplete() = 0;
|
|
|
|
virtual ~GMPDecryptor() {}
|
|
};
|
|
|
|
#endif // GMP_DECRYPTION_h_
|