Sha256: 2b69cfe604be7964945799b0c0678a22b2355d62a8d7dc3dd3b0d71eac37e847

Contents?: true

Size: 1.84 KB

Versions: 42

Compression:

Stored size: 1.84 KB

Contents

# Module containing the methods useful for child IFRAME to parent window communication
module RespondsToParent
  
  # Executes the response body as JavaScript in the context of the parent window.
  # Use this method of you are posting a form to a hidden IFRAME or if you would like
  # to use IFRAME base RPC.
  def responds_to_parent(&block)
    yield
    
    if performed?
      # We're returning HTML instead of JS or XML now
      response.headers['Content-Type'] = 'text/html; charset=UTF-8'
      
      # Either pull out a redirect or the request body
      script =  if location = erase_redirect_results
                  "document.location.href = #{location.to_s.inspect}"
                else
                  response.body
                end
                
      # Escape quotes, linebreaks and slashes, maintaining previously escaped slashes
      # Suggestions for improvement?
      script = (script || '').
        gsub('\\', '\\\\\\').
        gsub(/\r\n|\r|\n/, '\\n').
        gsub(/['"]/, '\\\\\&').
        gsub('</script>','</scr"+"ipt>')

      # Clear out the previous render to prevent double render
      erase_results
      
      # Eval in parent scope and replace document location of this frame 
      # so back button doesn't replay action on targeted forms
      # loc = document.location to be set after parent is updated for IE
      # with(window.parent) - pull in variables from parent window
      # setTimeout - scope the execution in the windows parent for safari
      # window.eval - legal eval for Opera
      render :text => "<html><body><script type='text/javascript' charset='utf-8'>
        var loc = document.location;
        with(window.parent) { setTimeout(function() { window.eval('#{script}'); loc.replace('about:blank'); }, 1) } 
      </script></body></html>"
    end
  end
  alias respond_to_parent responds_to_parent
end

Version data entries

42 entries across 42 versions & 4 rubygems

Version Path
zena-1.2.8 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.2.7 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.2.6 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.2.5 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.2.4 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.2.3 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.2.2 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.2.1 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.2.0 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.1.3 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.1.2 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.1.1 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.1.0 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.0.0 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.0.0.rc3 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
radiant-paperclipped-extension-0.8.1 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.0.0.rc2 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
zena-1.0.0.rc1 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb
rails_tinymce-0.0.1 plugins/responds_to_parent/lib/responds_to_parent.rb
zena-0.16.9 vendor/plugins/responds_to_parent/lib/responds_to_parent.rb