TrackEvent management proposal

This commit is contained in:
rwldrn 2010-12-16 13:44:19 -05:00
Родитель 9e939022ef
Коммит 9c5495081d
2 изменённых файлов: 192 добавлений и 12 удалений

Просмотреть файл

@ -36,6 +36,7 @@
this.video = elem ? elem : null;
this.data = {
history: [],
events: {},
trackEvents: {
byStart: [{start: -1, end: -1}],
@ -161,17 +162,6 @@
return dest;
};
Popcorn.addTrackEvent = function( obj, track ) {
// Store this definition in an array sorted by times
obj.data.trackEvents.byStart.push( track );
obj.data.trackEvents.byEnd.push( track );
obj.data.trackEvents.byStart.sort( function( a, b ){
return ( a.start - b.start );
});
obj.data.trackEvents.byEnd.sort( function( a, b ){
return ( a.end - b.end );
});
};
// A Few reusable utils, memoized onto Popcorn
Popcorn.extend( Popcorn, {
@ -438,6 +428,103 @@
natives: "load play pause currentTime playbackRate mute volume duration removePlugin roundTime trigger listen unlisten".toLowerCase().split(/\s+/)
};
Popcorn.addTrackEvent = function( obj, track ) {
if ( "natives" in track ) {
track["_id"] = track.natives.type + Popcorn.guid();
// Push track event ids into the history
obj.data.history.push( track["_id"] );
}
// Store this definition in an array sorted by times
obj.data.trackEvents.byStart.push( track );
obj.data.trackEvents.byEnd.push( track );
obj.data.trackEvents.byStart.sort( function( a, b ){
return ( a.start - b.start );
});
obj.data.trackEvents.byEnd.sort( function( a, b ){
return ( a.end - b.end );
});
};
Popcorn.removeTrackEvent = function( obj, trackId ) {
var trackLen = obj.data.trackEvents.byStart.length,
historyLen = obj.data.history.length,
byStart = [],
byEnd = [],
history = [];
Popcorn.forEach( obj.data.trackEvents.byStart, function( o, i, context) {
// Preserve the original start/end trackEvents
if ( !o._id ) {
byStart.push( obj.data.trackEvents.byStart[i] );
byEnd.push( obj.data.trackEvents.byEnd[i] );
}
// Filter for the trackevent to remove
if ( o._id && o._id !== trackId ) {
byStart.push( obj.data.trackEvents.byStart[i] );
byEnd.push( obj.data.trackEvents.byEnd[i] );
}
});
obj.data.trackEvents.byStart = byStart;
obj.data.trackEvents.byEnd = byEnd;
for ( var i = 0; i < historyLen; i++ ) {
if ( obj.data.history[i] !== trackId ) {
history.push( obj.data.history[i] );
}
}
obj.data.history = history;
};
Popcorn.getTrackEvents = function( obj ) {
var trackevents = [];
Popcorn.forEach( obj.data.trackEvents.byStart, function(o, i, context) {
if ( o._id ) {
trackevents.push(o);
}
});
return trackevents;
};
Popcorn.getLastTrackEventId = function( obj ) {
return obj.data.history[ obj.data.history.length - 1 ];
};
// Map TrackEvents functions to the {popcorn}.prototype
Popcorn.extend( Popcorn.p, {
getTrackEvents: function() {
return Popcorn.getTrackEvents.call( null, this );
},
getLastTrackEventId: function() {
return Popcorn.getLastTrackEventId.call( null, this );
},
removeTrackEvent: function( id ) {
Popcorn.removeTrackEvent.call( null, this, id );
return this;
}
});
// Plugins are registered
Popcorn.registry = [];
// An interface for extending Popcorn

Просмотреть файл

@ -660,7 +660,100 @@ test("Protected Names", function () {
};
});
});
Popcorn.xhr.httpData
module("Popcorn TrackEvents");
test("Functions", function () {
// TODO: break this into sep. units per function
var popped = Popcorn("#video"), ffTrackId, rwTrackId, rw2TrackId, historyRef, trackEvents;
Popcorn.plugin("ff", function () {
return {
start: function () {},
end: function () {}
};
});
popped.ff({
start: 3,
end: 4
});
ffTrackId = popped.getLastTrackEventId();
Popcorn.plugin("rw", function () {
return {
start: function () {},
end: function () {}
};
});
popped.rw({
start: 1,
end: 2
});
rwTrackId = popped.getLastTrackEventId();
historyRef = popped.data.history;
equals( historyRef.length, 2, "2 TrackEvents in history index");
equals( popped.data.trackEvents.byStart.length, 4, "4 TrackEvents in popped.data.trackEvents.byStart ");
equals( popped.data.trackEvents.byEnd.length, 4, "4 TrackEvents in popped.data.trackEvents.byEnd ");
trackEvents = popped.getTrackEvents();
equals( trackEvents.length, 2, "2 user created trackEvents returned by popped.getTrackEvents()" )
ok( ffTrackId !== rwTrackId, "Track Events have different ids" );
popped.removeTrackEvent( rwTrackId );
equals( popped.data.history.length, 1, "1 TrackEvent in history index - after popped.removeTrackEvent( rwTrackId ); ");
equals( popped.data.trackEvents.byStart.length, 3, "3 TrackEvents in popped.data.trackEvents.byStart ");
equals( popped.data.trackEvents.byEnd.length, 3, "3 TrackEvents in popped.data.trackEvents.byEnd ");
trackEvents = popped.getTrackEvents();
equals( trackEvents.length, 1, "1 user created trackEvents returned by popped.getTrackEvents()" )
popped.rw({
start: 1,
end: 2
});
rw2TrackId = popped.getLastTrackEventId();
equals( popped.data.history.length, 2, "2 TrackEvents in history index - after new track added ");
ok( rw2TrackId !== rwTrackId, "rw2TrackId !== rwTrackId" );
equals( popped.data.trackEvents.byStart.length, 4, "4 TrackEvents in popped.data.trackEvents.byStart - after new track added");
equals( popped.data.trackEvents.byEnd.length, 4, "4 TrackEvents in popped.data.trackEvents.byEnd - after new track added");
trackEvents = popped.getTrackEvents();
equals( trackEvents.length, 2, "2 user created trackEvents returned by popped.getTrackEvents()" )
});
module("Popcorn XHR");
test("Basic", function () {