|
@@ -0,0 +1,121 @@
|
|
|
|
+Smalltalk current createPackage: 'Spaces' properties: #{}!
|
|
|
|
+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
|
|
|
|
+ ^ frame contentWindow eval: '(', aBlock compiledSource, ')()'
|
|
|
|
+! !
|
|
|
|
+
|
|
|
|
+!ObjectSpace methodsFor: 'events'!
|
|
|
|
+
|
|
|
|
+whenReadyDo: aBlock
|
|
|
|
+ (window jQuery: frame)
|
|
|
|
+ bind: 'load'
|
|
|
|
+ do: aBlock
|
|
|
|
+! !
|
|
|
|
+
|
|
|
|
+!ObjectSpace methodsFor: 'initialization'!
|
|
|
|
+
|
|
|
|
+connectTo: aFrame
|
|
|
|
+ self release.
|
|
|
|
+ frame := aFrame
|
|
|
|
+!
|
|
|
|
+
|
|
|
|
+create
|
|
|
|
+ (window jQuery: 'body') append: '<iframe style="display: none;"></iframe>'.
|
|
|
|
+ frame := (window jQuery: 'iframe') get last.
|
|
|
|
+ frame contentWindow location: window location
|
|
|
|
+!
|
|
|
|
+
|
|
|
|
+initialize
|
|
|
|
+ super initialize.
|
|
|
|
+ self create
|
|
|
|
+! !
|
|
|
|
+
|
|
|
|
+!ObjectSpace methodsFor: 'releasing'!
|
|
|
|
+
|
|
|
|
+destroy
|
|
|
|
+ frame ifNil: [ ^ self ].
|
|
|
|
+ (window jQuery: frame) remove.
|
|
|
|
+
|
|
|
|
+ self release
|
|
|
|
+!
|
|
|
|
+
|
|
|
|
+release
|
|
|
|
+ frame := nil
|
|
|
|
+! !
|
|
|
|
+
|
|
|
|
+!ObjectSpace class methodsFor: 'instance creation'!
|
|
|
|
+
|
|
|
|
+on: aFrame
|
|
|
|
+ ^ self basicNew
|
|
|
|
+ connectTo: aFrame;
|
|
|
|
+ yourself
|
|
|
|
+! !
|
|
|
|
+
|
|
|
|
+TestCase subclass: #ObjectSpaceTest
|
|
|
|
+ instanceVariableNames: 'space'
|
|
|
|
+ package: 'Spaces'!
|
|
|
|
+
|
|
|
|
+!ObjectSpaceTest methodsFor: 'initialization'!
|
|
|
|
+
|
|
|
|
+setUp
|
|
|
|
+ space := ObjectSpace new
|
|
|
|
+!
|
|
|
|
+
|
|
|
|
+tearDown
|
|
|
|
+ space destroy.
|
|
|
|
+ space := nil
|
|
|
|
+! !
|
|
|
|
+
|
|
|
|
+!ObjectSpaceTest methodsFor: 'tests'!
|
|
|
|
+
|
|
|
|
+testCreate
|
|
|
|
+
|
|
|
|
+ self assert: space frame notNil
|
|
|
|
+!
|
|
|
|
+
|
|
|
|
+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
|
|
|
|
+! !
|
|
|
|
+
|