14

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?

3
  • 2
    Have you tried wrapping your URL in $sce.trustAsResourceUrl() ? Commented Nov 1, 2013 at 15:51
  • Any update on this? Did you find a solution? I'm having similar issues. Commented Dec 3, 2013 at 0:37
  • 2
    I cheated. Its was for some prototyping so I just put this in the .config '$sceProvider.enabled(false);' Commented Dec 4, 2013 at 19:35

5 Answers 5

20

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.

Sign up to request clarification or add additional context in comments.

Comments

4

For me the following solved the problem:

$sce.trustAsResourceUrl

see SO question with more detailed explanation here

Comments

1

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):/);
}]);

Comments

0

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>

1 Comment

This defeats the entire purpose of SCE. You'd probably be better off just disabling it than creating a filter which any html could inject on the page maliciously.
0

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);
}

2 Comments

You don't need FileReader... if you look carefully you see that the user has created a blob url using URL.createObjectURL(blob)
Exactly, and in case you are using a FileReader, and still facing the same error with '$sce', then $apply needs to be called, to trigger the watch variables changes

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.