diff --git a/lib/iruby/display.rb b/lib/iruby/display.rb index 340a437..22e380a 100644 --- a/lib/iruby/display.rb +++ b/lib/iruby/display.rb @@ -44,7 +44,18 @@ def clear_output(wait = false) private def protect(mime, data) - MIME::Type.new(mime).ascii? ? data.to_s : [data.to_s].pack('m0') + ascii?(mime) ? data.to_s : [data.to_s].pack('m0') + end + + def ascii?(mime) + case mime + when "application/javascript" + # Special case for application/javascript. + # This needs because mime-types tells us application/javascript a non-text type. + true + else + MIME::Type.new(mime).ascii? + end end def render(data, obj, exact_mime, fuzzy_mime) diff --git a/test/iruby/mime_test.rb b/test/iruby/mime_test.rb index 81a4419..d7517f8 100644 --- a/test/iruby/mime_test.rb +++ b/test/iruby/mime_test.rb @@ -1,14 +1,25 @@ class IRubyTest::MimeTest < IRubyTest::TestBase sub_test_case("IRuby::Display") do - def test_display_with_mime_type - html = "Bold Text" + sub_test_case(".display") do + sub_test_case("with mime type") do + test("text/html") do + html = "Bold Text" - obj = Object.new - obj.define_singleton_method(:to_s) { html } + obj = Object.new + obj.define_singleton_method(:to_s) { html } - res = IRuby::Display.display(obj, mime: "text/html") - assert_equal({ plain: obj.inspect, html: html }, - { plain: res["text/plain"], html: res["text/html"] }) + res = IRuby::Display.display(obj, mime: "text/html") + assert_equal({ plain: obj.inspect, html: html }, + { plain: res["text/plain"], html: res["text/html"] }) + end + + test("application/javascript") do + data = "alert('Hello World!')" + res = IRuby::Display.display(data, mime: "application/javascript") + assert_equal(data, + res["application/javascript"]) + end + end end end