@ -4,16 +4,15 @@
( function ( ) {
( function ( ) {
'use strict' ;
'use strict' ;
var FileView = Backbone . View . extend ( {
var FileView = Whisper . View . extend ( {
tagName : 'a' ,
tagName : 'div' ,
initialize : function ( dataUrl ) {
className : 'fileView' ,
this . dataUrl = dataUrl ;
templateName : 'file-view' ,
this . $el . text ( i18n ( 'unsupportedAttachment' ) ) ;
render _attributes : function ( ) {
} ,
return {
render : function ( ) {
fileName : this . model . fileName ,
this . $el . attr ( 'href' , this . dataUrl ) ;
altText : i18n ( 'unsupportedAttachment' )
this . trigger ( 'update' ) ;
} ;
return this ;
}
}
} ) ;
} ) ;
@ -58,6 +57,12 @@
var AudioView = MediaView . extend ( { tagName : 'audio' } ) ;
var AudioView = MediaView . extend ( { tagName : 'audio' } ) ;
var VideoView = MediaView . extend ( { tagName : 'video' } ) ;
var VideoView = MediaView . extend ( { tagName : 'video' } ) ;
// Blacklist common file types known to be unsupported in Chrome
var UnsupportedFileTypes = [
'audio/aiff' ,
'video/quicktime'
] ;
Whisper . AttachmentView = Backbone . View . extend ( {
Whisper . AttachmentView = Backbone . View . extend ( {
tagName : 'span' ,
tagName : 'span' ,
className : 'attachment' ,
className : 'attachment' ,
@ -76,9 +81,6 @@
} ,
} ,
onclick : function ( e ) {
onclick : function ( e ) {
switch ( this . contentType ) {
switch ( this . contentType ) {
case 'audio' :
case 'video' :
return ;
case 'image' :
case 'image' :
var view = new Whisper . LightboxView ( { model : this } ) ;
var view = new Whisper . LightboxView ( { model : this } ) ;
view . render ( ) ;
view . render ( ) ;
@ -86,6 +88,10 @@
view . $el . trigger ( 'show' ) ;
view . $el . trigger ( 'show' ) ;
break ;
break ;
case 'video' :
if ( this . view instanceof MediaView ) {
return ;
}
default :
default :
this . saveFile ( ) ;
this . saveFile ( ) ;
}
}
@ -126,18 +132,39 @@
var View ;
var View ;
switch ( this . contentType ) {
switch ( this . contentType ) {
case 'image' : View = ImageView ; break ;
case 'image' : View = ImageView ; break ;
case 'audio' : View = AudioView ; break ;
case 'video' : View = VideoView ; break ;
case 'video' : View = VideoView ; break ;
default : View = File View; break ;
case 'audio' : View = Audio View; break ;
}
}
if ( ! View || _ . contains ( UnsupportedFileTypes , this . model . contentType ) ) {
return this . renderFileView ( ) ;
}
if ( ! this . objectUrl ) {
if ( ! this . objectUrl ) {
this . objectUrl = window . URL . createObjectURL ( this . blob ) ;
this . objectUrl = window . URL . createObjectURL ( this . blob ) ;
}
}
var view = new View ( this . objectUrl , this . model . contentType ) ;
this . view = new View ( this . objectUrl , this . model . contentType ) ;
view . $el . appendTo ( this . $el ) ;
this . view . $el . appendTo ( this . $el ) ;
view . on ( 'update' , this . trigger . bind ( this , 'update' ) ) ;
this . listenTo ( this . view , 'update' , this . update ) ;
view . render ( ) ;
this . view . render ( ) ;
this . timeout = setTimeout ( this . onTimeout . bind ( this ) , 3000 ) ;
return this ;
return this ;
} ,
onTimeout : function ( ) {
// Image or media element failed to load. Fall back to FileView.
this . stopListening ( this . view ) ;
this . renderFileView ( ) ;
} ,
renderFileView : function ( ) {
this . view = new FileView ( { model : { fileName : this . suggestedName ( ) } } ) ;
this . view . $el . appendTo ( this . $el . empty ( ) ) ;
this . view . render ( ) ;
this . update ( ) ;
return this ;
} ,
update : function ( ) {
clearTimeout ( this . timeout ) ;
this . trigger ( 'update' ) ;
}
}
} ) ;
} ) ;