mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-04-13 22:39:59 +08:00
fix(Scope): revert the __proto__ cleanup as that could cause regressions
When a async task interacts with a scope that has been destroyed already and if it interacts with a property that is prototypically inherited from some parent scope then resetting proto would make these inherited properties inaccessible and would result in NPEs
This commit is contained in:
@@ -757,14 +757,6 @@ function $RootScopeProvider(){
|
||||
// prevent NPEs since these methods have references to properties we nulled out
|
||||
this.$destroy = this.$digest = this.$apply = noop;
|
||||
this.$on = this.$watch = function() { return noop; };
|
||||
|
||||
|
||||
/* jshint -W103 */
|
||||
// not all browsers have __proto__ so check first
|
||||
if (this.__proto__) {
|
||||
this.__proto__ = null;
|
||||
}
|
||||
/* jshint +W103 */
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -898,6 +898,25 @@ describe('Scope', function() {
|
||||
var fn = child.$watch('somePath', function() {});
|
||||
expect(fn).toBe(noop);
|
||||
}));
|
||||
|
||||
|
||||
it("should preserve all (own and inherited) model properties on a destroyed scope",
|
||||
inject(function($rootScope) {
|
||||
// This test simulates an async task (xhr response) interacting with the scope after the scope
|
||||
// was destroyed. Since we can't abort the request, we should ensure that the task doesn't
|
||||
// throw NPEs because the scope was cleaned up during destruction.
|
||||
|
||||
var parent = $rootScope.$new(),
|
||||
child = parent.$new();
|
||||
|
||||
parent.parentModel = 'parent';
|
||||
child.childModel = 'child';
|
||||
|
||||
child.$destroy();
|
||||
|
||||
expect(child.parentModel).toBe('parent');
|
||||
expect(child.childModel).toBe('child');
|
||||
}));
|
||||
});
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user