diff options
author | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2014-07-02 20:23:42 -0300 |
---|---|---|
committer | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2014-07-02 20:23:42 -0300 |
commit | beab403fc31199bbb01f1e6e1ba0f839af047afe (patch) | |
tree | e1bb44ddb80a2a5259f968a1ee3a7b78edbf6ef1 | |
parent | f2fc31473f0b0e7c8fe39156413b626358131543 (diff) | |
parent | b00b638b95dc513f4ba854ba3a96b7a8f344e4cc (diff) | |
download | rails-beab403fc31199bbb01f1e6e1ba0f839af047afe.tar.gz rails-beab403fc31199bbb01f1e6e1ba0f839af047afe.tar.bz2 rails-beab403fc31199bbb01f1e6e1ba0f839af047afe.zip |
Merge pull request #16026 from lucasmazza/lm-respond-to-jsonp-fix
Change the JSON renderer to enforce the 'JS' Content Type
-rw-r--r-- | actionpack/CHANGELOG.md | 7 | ||||
-rw-r--r-- | actionpack/lib/action_controller/metal/renderers.rb | 5 | ||||
-rw-r--r-- | actionpack/test/controller/mime/respond_to_test.rb | 13 |
3 files changed, 24 insertions, 1 deletions
diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md index cc72aa3081..c8ea4052f6 100644 --- a/actionpack/CHANGELOG.md +++ b/actionpack/CHANGELOG.md @@ -1,3 +1,10 @@ +* JSONP responses are now rendered with the `text/javascript` content type + when rendering through a `respond_to` block. + + Fixes #15081. + + *Lucas Mazza* + * Add `config.action_controller.always_permitted_parameters` to configure which parameters are permitted globally. The default value of this configuration is `['controller', 'action']`. diff --git a/actionpack/lib/action_controller/metal/renderers.rb b/actionpack/lib/action_controller/metal/renderers.rb index 46405cef55..ae55e6d7f5 100644 --- a/actionpack/lib/action_controller/metal/renderers.rb +++ b/actionpack/lib/action_controller/metal/renderers.rb @@ -112,7 +112,10 @@ module ActionController json = json.to_json(options) unless json.kind_of?(String) if options[:callback].present? - self.content_type ||= Mime::JS + if self.content_type.nil? || self.content_type == Mime::JSON + self.content_type = Mime::JS + end + "#{options[:callback]}(#{json})" else self.content_type ||= Mime::JSON diff --git a/actionpack/test/controller/mime/respond_to_test.rb b/actionpack/test/controller/mime/respond_to_test.rb index 41503e11a8..c89b95de3b 100644 --- a/actionpack/test/controller/mime/respond_to_test.rb +++ b/actionpack/test/controller/mime/respond_to_test.rb @@ -128,6 +128,12 @@ class RespondToController < ActionController::Base end end + def json_with_callback + respond_to do |type| + type.json { render :json => 'JS', :callback => 'alert' } + end + end + def iphone_with_html_response_type request.format = :iphone if request.env["HTTP_ACCEPT"] == "text/iphone" @@ -511,6 +517,13 @@ class RespondToControllerTest < ActionController::TestCase assert_equal '<html><div id="html">HTML for all_types_with_layout</div></html>', @response.body end + def test_json_with_callback_sets_javascript_content_type + @request.accept = 'application/json' + get :json_with_callback + assert_equal 'alert(JS)', @response.body + assert_equal 'text/javascript', @response.content_type + end + def test_xhr xhr :get, :js_or_html assert_equal 'JS', @response.body |