Reputation: 2639
I am trying to use angular ngRepeat with the html5 audio tag. I have the html:
<li ng-repeat="recordings in recordinglist">
<audio controls ng-src="{{recordings}}"></audio>
</li>
and the js:
$scope.$apply($scope.recordinglist.push("blob:http%3A//localhost%3A9000/67ecfa65-3394-45a6-8f29-42f3421a2727"));
But angular's same origin checking is causing an error to be thrown on interpolation:
Error: [$interpolate:interr] Can't interpolate: {{recordings}}
Error: [$sce:insecurl] Blocked loading resource from url not allowed by $sceDelegate policy. URL: blob:http%3A//localhost%3A9000/67ecfa65-3394-45a6-8f29-42f3421a2727
This just seems silly. It's not interpolating a local resource. I imagine there's a way to do this correctly - or should I file a bug report?
Upvotes: 14
Views: 16235
Reputation: 420
I have the same problem when trying to display a blob src for webrtc video before, and I fixed it by using $sce service:
angular.module('moduleName', ['ngSanitize'])
.controller('ctrName', ['$sce', function($sce) {
$scope.recordings = $sce.trustAsResourceUrl(recordings);
}])
You may also check the doc here.
Upvotes: 20
Reputation: 3997
When getting the blob from a file reader, you might have to add $scope.$apply()
to trigger the watch and bind accordingly.
InitRecording = function() {
var reader = new FileReader();
reader.onload = function() {
audioSRC = $sce.trustAsResourceUrl(reader.result);
$scope.$apply();
};
reader.readAsDataURL(recordedBlob);
}
Upvotes: 0
Reputation: 1590
Best way to solve this is to create a trusted filter.
app.filter('trusted', ['$sce', function ($sce) {
return function(url) {
return $sce.trustAsResourceUrl(url);
};}]);
And Use this filter in ng-src.
<li ng-repeat="recordings in recordinglist">
<audio controls ng-src="{{recordings |trusted}}"></audio></li>
Upvotes: 0
Reputation: 2521
For me the following solved the problem:
$sce.trustAsResourceUrl
see SO question with more detailed explanation here
Upvotes: 4
Reputation: 37786
Faced a similar problem with my blob images... Try this:
Basically it allows any blob image in src
app.config( ['$compileProvider', function($compileProvider){
$compileProvider.imgSrcSanitizationWhitelist(/^\s*(blob):/);
// another sample to allow diffrent kinds of url in <a>
// $compileProvider.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto):/);
}]);
Upvotes: 1