mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Prevent RED.node.registerNode from overriding a constructor's prototype (#865)
* prevent registry.registerNodeConstructor from overriding a constructors protoype * fix for node < v5.0.0 * exercise another code path * altering __proto__ for node < v0.12 * move inheritance code to helper function
This commit is contained in:
		
				
					committed by
					
						 Nick O'Leary
						Nick O'Leary
					
				
			
			
				
	
			
			
			
						parent
						
							e1d09349ff
						
					
				
				
					commit
					b909e32201
				
			| @@ -20,8 +20,12 @@ var sinon = require("sinon"); | ||||
|  | ||||
| var typeRegistry = require("../../../../../red/runtime/nodes/registry/registry"); | ||||
|  | ||||
| var Node = require("../../../../../red/runtime/nodes/Node"); | ||||
|  | ||||
| var events = require("../../../../../red/runtime/events"); | ||||
|  | ||||
| var inherits = require("util").inherits; | ||||
|  | ||||
| describe("red/nodes/registry/registry",function() { | ||||
|  | ||||
|     afterEach(function() { | ||||
| @@ -428,9 +432,10 @@ describe("red/nodes/registry/registry",function() { | ||||
|     }); | ||||
|  | ||||
|     describe('#registerNodeConstructor', function() { | ||||
|         function TestNodeConstructor() { | ||||
|         } | ||||
|         var TestNodeConstructor; | ||||
|         beforeEach(function() { | ||||
|             TestNodeConstructor = function TestNodeConstructor() { | ||||
|             }; | ||||
|             sinon.stub(events,'emit'); | ||||
|         }); | ||||
|         afterEach(function() { | ||||
| @@ -452,7 +457,27 @@ describe("red/nodes/registry/registry",function() { | ||||
|                 typeRegistry.registerNodeConstructor('node-type',TestNodeConstructor); | ||||
|             }).should.throw("node-type already registered"); | ||||
|             events.emit.calledOnce.should.be.true; | ||||
|         }) | ||||
|         }); | ||||
|         it('extends a constructor with the Node constructor', function() { | ||||
|             TestNodeConstructor.prototype.should.not.be.an.instanceOf(Node); | ||||
|             typeRegistry.registerNodeConstructor('node-type',TestNodeConstructor); | ||||
|             TestNodeConstructor.prototype.should.be.an.instanceOf(Node); | ||||
|         }); | ||||
|         it('does not override a constructor\'s prototype', function() { | ||||
|             function Foo(){}; | ||||
|             inherits(TestNodeConstructor,Foo); | ||||
|             TestNodeConstructor.prototype.should.be.an.instanceOf(Foo); | ||||
|             TestNodeConstructor.prototype.should.not.be.an.instanceOf(Node); | ||||
|  | ||||
|             typeRegistry.registerNodeConstructor('node-type',TestNodeConstructor); | ||||
|  | ||||
|             TestNodeConstructor.prototype.should.be.an.instanceOf(Node); | ||||
|             TestNodeConstructor.prototype.should.be.an.instanceOf(Foo); | ||||
|  | ||||
|             typeRegistry.registerNodeConstructor('node-type2',TestNodeConstructor); | ||||
|             TestNodeConstructor.prototype.should.be.an.instanceOf(Node); | ||||
|             TestNodeConstructor.prototype.should.be.an.instanceOf(Foo); | ||||
|         }); | ||||
|     }); | ||||
|  | ||||
| }); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user