[MacRuby-devel] [MacRuby] #594: Not all methods visible to objective-c calls

MacRuby ruby-noreply at macosforge.org
Tue Feb 2 14:38:06 PST 2010


#594: Not all methods visible to objective-c calls
------------------------------+---------------------------------------------
 Reporter:  michael@…         |       Owner:  lsansonetti@…        
     Type:  defect            |      Status:  new                  
 Priority:  blocker           |   Milestone:                       
Component:  MacRuby           |    Keywords:                       
------------------------------+---------------------------------------------
 The following code is taken from
 http://code.reflectivepixel.com/post/103638573/require-hotcocoa-framework-
 webkit-class and is just a short example of showing the problem:

 {{{
 require 'hotcocoa'
 framework 'webkit'
 class Application
 include HotCocoa
 FULL={:expand => [:width,:height]}
 BASE=<<-END
   <html><head><style type="text/css">
   * { font-family: Monaco; }
   </style><script type="text/javascript">
   function say(arg) { window.TheBridge.click(arg);}
   </script>
   </head><body><h3>Ruby JavaScript Bridge</h3>
   <a href="#" onclick="say('hi')">tell</a></body></html>
 END
 def click(arg) #called from javascript
   root = document.createElement("div");
   root.innerHTML="javascript tells ruby: #{arg}"
   document.body.appendChild(root)
 end
 def document
   @web_view.mainFrame.DOMDocument
 end
 def self.webScriptNameForSelector(sel) #hide : in name
   sel.to_s.sub(/:$/,'') if is_available_selector?(sel)
 end
 def self.isSelectorExcludedFromWebScript(sel)
   ! is_available_selector?(sel)
 end
 def self.isKeyExcludedFromWebScript(key)
   true
 end
 def self.is_available_selector?(sel)
   ['click:'].include?(sel.to_s)
 end
 def start
   application :name => "MyBridge" do |app|
     app.delegate = self
     window :title => "MyBridge",
       :frame => [10, 620, 330, 230] do |win|
       win << @web_view=web_view(:layout => FULL) do |wv|
         wv.mainFrame.loadHTMLString BASE, baseURL: nil
         wv.frameLoadDelegate=self
         wso=wv.windowScriptObject #make visible to JS
         wso.setValue(self, forKey:"TheBridge")
       end
       win.will_close { exit }
     end
   end
 end
 end
 Application.new.start
 }}}

 In this example, clicking on "tell" does not work. It seems, that the
 selector for "click:" is not found. When logging for example the selector
 values in {{{ self.isSelectorExcludedFromWebScript(sel) }}}, the "click:"
 selector is not amongst the results.

 This is not related to hotcocoa, this example can be simply reworked
 without using hotcocoa, just with a simple WebView embedded in a NSWindow
 from Interface Builder.

-- 
Ticket URL: <http://www.macruby.org/trac/ticket/594>
MacRuby <http://macruby.org/>



More information about the MacRuby-devel mailing list