|
@@ -1000,19 +1000,7 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- /* Handles #dnu: *and* JavaScript method calls.
|
|
|
- if the receiver has no klass, we consider it a JS object (outside of the
|
|
|
- Amber system). Else assume that the receiver understands #doesNotUnderstand: */
|
|
|
-
|
|
|
- function messageNotUnderstood(receiver, selector, args) {
|
|
|
- /* Handles JS method calls. */
|
|
|
- if(receiver.klass === undefined || receiver.allowJavaScriptCalls) {
|
|
|
- return callJavaScriptMethod(receiver, selector, args);
|
|
|
- }
|
|
|
-
|
|
|
- /* Handles not understood messages. Also see the Amber counter-part
|
|
|
- Object>>doesNotUnderstand: */
|
|
|
-
|
|
|
+ function invokeDnuMethod(receiver, selector, args) {
|
|
|
return receiver._doesNotUnderstand_(
|
|
|
globals.Message._new()
|
|
|
._selector_(st.convertSelector(selector))
|
|
@@ -1020,6 +1008,18 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ /* Handles #dnu: *and* JavaScript method calls.
|
|
|
+ if the receiver has no klass, we consider it a JS object (outside of the
|
|
|
+ Amber system). Else assume that the receiver understands #doesNotUnderstand: */
|
|
|
+ function messageNotUnderstood(receiver, selector, args) {
|
|
|
+ return receiver.klass === undefined || receiver.allowJavaScriptCalls ?
|
|
|
+ /* Handles JS method calls. */
|
|
|
+ callJavaScriptMethod(receiver, selector, args) :
|
|
|
+ /* Handles not understood messages. Also see the Amber counter-part
|
|
|
+ Object>>doesNotUnderstand: */
|
|
|
+ invokeDnuMethod(receiver, selector, args);
|
|
|
+ }
|
|
|
+
|
|
|
/* Call a method of a JS object, or answer a property if it exists.
|
|
|
Else try wrapping a JSObjectProxy around the receiver.
|
|
|
|
|
@@ -1032,24 +1032,26 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
|
|
|
|
|
|
Example:
|
|
|
"self do: aBlock with: anObject" -> "self.do(aBlock, anObject)" */
|
|
|
-
|
|
|
function callJavaScriptMethod(receiver, selector, args) {
|
|
|
var jsSelector = selector._asJavaScriptSelector();
|
|
|
- if (jsSelector in receiver) {
|
|
|
- var jsProperty = receiver[jsSelector];
|
|
|
- if (typeof jsProperty === "function" && !/^[A-Z]/.test(jsSelector)) {
|
|
|
- return jsProperty.apply(receiver, args);
|
|
|
- } else if (args.length > 0) {
|
|
|
- receiver[jsSelector] = args[0];
|
|
|
- return nil;
|
|
|
- } else {
|
|
|
- return jsProperty;
|
|
|
- }
|
|
|
- }
|
|
|
+ return jsSelector in receiver ?
|
|
|
+ accessJavaScript(receiver, jsSelector, args) :
|
|
|
+ invokeDnuMethod(globals.JSObjectProxy._on_(receiver), selector, args);
|
|
|
+ }
|
|
|
|
|
|
- return st.send(globals.JSObjectProxy._on_(receiver), selector, args);
|
|
|
+ function accessJavaScript(receiver, jsSelector, args) {
|
|
|
+ var jsProperty = receiver[jsSelector];
|
|
|
+ if (typeof jsProperty === "function" && !/^[A-Z]/.test(jsSelector)) {
|
|
|
+ return jsProperty.apply(receiver, args);
|
|
|
+ } else if (args.length > 0) {
|
|
|
+ receiver[jsSelector] = args[0];
|
|
|
+ return nil;
|
|
|
+ } else {
|
|
|
+ return jsProperty;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ st.accessJavaScript = accessJavaScript;
|
|
|
this.messageNotUnderstood = messageNotUnderstood;
|
|
|
}
|
|
|
|