Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Unified Diff: third_party/WebKit/LayoutTests/imported/wpt/encrypted-media/polyfill/edge-persistent-usage-record.js

Issue 2546853003: Add W3C encrypted-media tests (Closed)
Patch Set: rebase now that content files landed Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/LayoutTests/imported/wpt/encrypted-media/polyfill/edge-persistent-usage-record.js
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/encrypted-media/polyfill/edge-persistent-usage-record.js b/third_party/WebKit/LayoutTests/imported/wpt/encrypted-media/polyfill/edge-persistent-usage-record.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f86f0c05895a2f82ec4ac80252cf4eb4a33d5e2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/imported/wpt/encrypted-media/polyfill/edge-persistent-usage-record.js
@@ -0,0 +1,193 @@
+(function() {
+
+ // This polyfill fixes the following problems with Edge browser
+ // (1) To retrieve a persisted usage record, you must use session type 'persistent-release-message' instead of 'persistent-usage-record'
+ // (2) To retrieve a persisted usage record, you must call remove() after calling load()
+ // (3) On providing a license release acknowledgement, the session does not automatically close as is should
+ // (4) Retrieval of the usage record at the end of an active session is not supported
+
+ if ( navigator.userAgent.toLowerCase().indexOf('edge') > -1 ) {
+
+ var _mediaKeySystemAccessCreateMediaKeys = MediaKeySystemAccess.prototype.createMediaKeys;
+ _mediaKeysCreateSession = MediaKeys.prototype.createSession;
+
+ // MediaKeySession proxy
+ function MediaKeySession( mediaKeys, session )
+ {
+ EventTarget.call( this );
+
+ this._mediaKeys = mediaKeys;
+ this._session = session;
+ this._sessionId = undefined;
+ this._removing = false;
+
+ session.addEventListener( 'message', this.dispatchEvent.bind( this ) );
+ session.addEventListener( 'keystatuseschange', this.dispatchEvent.bind( this ) );
+ session.closed.then( function() { if ( !this._removing ) this._resolveClosed(); }.bind ( this ) );
+
+ this._closed = new Promise( function( resolve ) { this._resolveClosed = resolve; }.bind( this ) );
+ }
+
+ MediaKeySession.prototype = Object.create( EventTarget.prototype );
+
+ Object.defineProperties( MediaKeySession.prototype, {
+ sessionId: { get: function() { return this._sessionId ? this._sessionId : this._session.sessionId; } },
+ expiration: { get: function() { return this._session.expiration; } },
+ closed: { get: function() { return this._closed; } },
+ keyStatuses:{ get: function() { return this._session.keyStatuses; } }
+ });
+
+ // load()
+ //
+ // Use a surrogate 'persistent-release-message' session to obtain the release message
+ //
+ MediaKeySession.prototype.load = function load( sessionId )
+ {
+ if ( this.sessionId ) return Promise.reject( new DOMException('InvalidAccessError') );
+
+ this._surrogate = this._mediaKeys.createSession( 'persistent-release-message' );
+ this._surrogate.addEventListener( 'message', this.dispatchEvent.bind( this ) );
+
+ return this._surrogate.load( sessionId ).then( function( success ) {
+ if (!success) return false;
+
+ this._sessionId = sessionId;
+ this._removing = true;
+ this._session.close();
+
+ return this._surrogate.remove().then( function() { return true; } );
+ }.bind( this ) );
+ };
+
+ // remove()
+ //
+ // On an existing session, use a surrogate 'persistent-release-message' session to obtain the release message
+ //
+ MediaKeySession.prototype.remove = function remove()
+ {
+ if ( this._sessionId !== undefined ) return Promise.reject( new DOMException('InvalidAccessError') );
+ if ( this.sessionId === undefined ) return Promise.reject( new DOMException('InvalidAccessError') );
+
+ this._surrogate = this._mediaKeys.createSession( 'persistent-release-message' );
+ this._surrogate.addEventListener( 'message', this.dispatchEvent.bind( this ) );
+ this._removing = true;
+ this._sessionId = this._session.sessionId;
+
+ var self = this;
+
+ return Promise.all( [ self._session.close(), self._session.closed ] ).then( function() {
+ return self._surrogate.load( self._sessionId );
+ }).then( function( success ) {
+ if ( !success ) {
+ throw new DOMException('InvalidAccessError');
+ }
+
+ return self._surrogate.remove();
+ }).then( function() { return true; } );
+ }
+
+ // update()
+ //
+ // For a normal session, pass through, otherwise update the surrogate and close the proxy
+ MediaKeySession.prototype.update = function update( message )
+ {
+ if ( !this._removing ) return this._session.update( message );
+
+ return this._surrogate.update( message ).then( function() {
+ this._sessionId = undefined;
+ this._resolveClosed();
+ }.bind( this ) );
+ };
+
+ // close() - pass through
+ //
+ MediaKeySession.prototype.close = function close()
+ {
+ if ( !this._removing ) return this._session.close();
+ this._resolveClosed();
+ return Promise.resolve();
+ };
+
+ // generateRequest() - pass through
+ //
+ MediaKeySession.prototype.generateRequest = function generateRequest( initDataType, initData )
+ {
+ if ( this.sessionId ) Promise.reject( new DOMException('InvalidAccessError') );
+ return this._session.generateRequest( initDataType, initData );
+ };
+
+ // Wrap PlayReady persistent-usage-record sessions in our Proxy
+ MediaKeys.prototype.createSession = function createSession( sessionType ) {
+
+ var session = _mediaKeysCreateSession.call( this, sessionType );
+ if ( this._keySystem !== 'com.microsoft.playready' || sessionType !== 'persistent-usage-record' )
+ {
+ return session;
+ }
+
+ return new MediaKeySession( this, session );
+
+ };
+
+ //
+ // Annotation polyfills - annotate not otherwise available data
+ //
+
+ // Annotate MediaKeys with the keysystem
+ MediaKeySystemAccess.prototype.createMediaKeys = function createMediaKeys()
+ {
+ return _mediaKeySystemAccessCreateMediaKeys.call( this ).then( function( mediaKeys ) {
+ mediaKeys._keySystem = this.keySystem;
+ return mediaKeys;
+ }.bind( this ) );
+ };
+
+ //
+ // Utilities
+ //
+
+ // Allow us to modify the target of Events
+ Object.defineProperties( Event.prototype, {
+ target: { get: function() { return this._target || this.currentTarget; },
+ set: function( newtarget ) { this._target = newtarget; } }
+ } );
+
+ // Make an EventTarget base class
+ function EventTarget(){
+ this.listeners = {};
+ };
+
+ EventTarget.prototype.listeners = null;
+
+ EventTarget.prototype.addEventListener = function(type, callback){
+ if(!(type in this.listeners)) {
+ this.listeners[type] = [];
+ }
+ this.listeners[type].push(callback);
+ };
+
+ EventTarget.prototype.removeEventListener = function(type, callback){
+ if(!(type in this.listeners)) {
+ return;
+ }
+ var stack = this.listeners[type];
+ for(var i = 0, l = stack.length; i < l; i++){
+ if(stack[i] === callback){
+ stack.splice(i, 1);
+ return this.removeEventListener(type, callback);
+ }
+ }
+ };
+
+ EventTarget.prototype.dispatchEvent = function(event){
+ if(!(event.type in this.listeners)) {
+ return;
+ }
+ var stack = this.listeners[event.type];
+ event.target = this;
+ for(var i = 0, l = stack.length; i < l; i++) {
+ stack[i].call(this, event);
+ }
+ };
+ }
+})();

Powered by Google App Engine
This is Rietveld 408576698