| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 | Smalltalk current createPackage: 'Spaces'!Object subclass: #ObjectSpace	instanceVariableNames: 'frame'	package: 'Spaces'!!ObjectSpace commentStamp!I am a connection to another Smalltalk environment.The implementation creates an iframe on the same location as the window, and connect to the Amber environment.## Usage example:	| space |		space := ObjectSpace new.	space do: [ smalltalk ] "Answers aSmalltalk"	(space do: [ smalltalk ]) == smalltalk "Answers false"		space release "Remove the object space environment"!!ObjectSpace methodsFor: 'accessing'!frame	^ frame! !!ObjectSpace methodsFor: 'evaluating'!do: aBlock	self isConnected ifFalse: [ ^ ObjectSpaceConnectionError signal ].	^ frame contentWindow eval: '(', aBlock compiledSource, ')()'! !!ObjectSpace methodsFor: 'events'!whenReadyDo: aBlock	frame asJQuery		bind: 'load'		do: aBlock! !!ObjectSpace methodsFor: 'initialization'!connectTo: aFrame	self release.	frame := aFrame!create	'body' asJQuery append: '<iframe style="display: none;"></iframe>'.	frame := 'iframe' asJQuery get last.	frame contentWindow location: window location!initialize	super initialize.	self create!isConnected	^ self frame notNil! !!ObjectSpace methodsFor: 'releasing'!destroy	frame ifNil: [ ^ self ].	frame asJQuery remove.	self release!release	frame := nil! !!ObjectSpace class methodsFor: 'instance creation'!on: aFrame	^ self basicNew		connectTo: aFrame;		yourself! !Error subclass: #ObjectSpaceConnectionError	instanceVariableNames: ''	package: 'Spaces'!!ObjectSpaceConnectionError methodsFor: 'accessing'!messageText	^ 'The ObjectSpace is not connected'! !TestCase subclass: #ObjectSpaceTest	instanceVariableNames: 'space'	package: 'Spaces'!!ObjectSpaceTest methodsFor: 'initialization'!setUp	space := ObjectSpace new!tearDown	space destroy! !!ObjectSpaceTest methodsFor: 'tests'!testConnection	space destroy.	self deny: space isConnected.	self should: [ space do: [] ] raise: ObjectSpaceConnectionError!testCreate	self assert: space frame notNil.	self assert: space isConnected!testEvaluation	| result |	space whenReadyDo: [		result := space do: [ smalltalk ].		self assert: result class name equals: 'Smalltalk'.		self deny: result class = Smalltalk.		self deny: result == smalltalk ]!testRelease	self deny: space frame isNil.	space release.		self assert: space frame isNil! !
 |