Уязвимость AngularJS 1.5 для IBM Mobilefirst

Кажется, у меня проблемы с объединением приложения MFP hybrid (no cordova) и angular 1.5. То же самое приложение с angular 1.4.9 отлично работает, но если я переключусь на угловое значение 1.5, я получаю эту ошибку:

Error: [$injector:modulerr] Failed to instantiate module ng due to:
TypeError: Cannot set property 'aHrefSanitizationWhitelist' of null
at $$SanitizeUriProvider (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:17272:35)
at new <anonymous> (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/worklight/worklight.js:1033:23)
at Object.instantiate (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4621:14)
at provider (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4435:36)
at http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:367:32
at forEach (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:337:20)
at Object.provider (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4425:9)
at ngModule (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:2476:16)
at Object.invoke (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4606:19)
at runInvokeQueue (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4499:35)
http://errors.angularjs.org/1.5.0/$injector/modulerr?p0=ng&p1=TypeError%3A%…%2FHelloWorld%2Fandroid%2F1.0%2Fdefault%2Fvendor%2Fangular5.js%3A4499%3A35)

кто-нибудь подскажет, что это может быть?

Ответы

Ответ 1

У меня была такая же проблема, когда я обновился до angular 1.5.0.
Проблема оказалась с пользовательской реализацией Function.prototype.bind, которая была у нас в нашем коде, похоже, что это мешает той, которая определена в angular.

Возьмите вторую строку в своем стеке ошибок

at new <anonymous> (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/worklight/worklight.js:1033:23)

Я думаю, что worklight.js может иметь реализацию prototype.bind, которая несовместима с той, что находится в angular (см. https://code.angularjs.org/1.5.0/docs/api/ng/function/angular.bind)

Ответ 2

Также видим это на плагине MFP 8.0 cordova.

Ответ 3

Как уже упоминалось, это может быть вызвано полифониями для Function.prototype.bind. В частности, это, по-видимому, вызвано тем, что неправильно обрабатывает вызов функции как конструктора с новым. Простые реализации всегда могут возвращать связанный объект независимо от вызова, тогда как ожидание состоит в том, что новый оператор превалирует над привязкой, а вновь созданный объект возвращается вместо него.

например.

// create an object to bind to
var alt = {
    message: 'I am the alternate'
};

// our function
function myFunc() { 
   console.log( this.message );
};

// bind our alternate object to this for myFunc
myFunc.bind( alt );

Стандартный вызов запускается как ожидаемый

myFunc(); // output 'I am the alternate'

Вызов через новый не как Ожидаемый (это тот, который разбивает angular 1.5)

new myFunc(); // also outputs 'I am the alternate'</jscodeblock>

Ожидаемое поведение заключается в том, что новый вызов будет возвращать новый объект, а не связанный.

Если вам нужен polyfill для Function.prototype.bind, убедитесь, что он правильно обрабатывает этот сценарий, например, тот, который найден в MDN.