class Speedup::Middleware::SpeedupBody
Public Class Methods
new(rack_body, redirects=[])
click to toggle source
# File lib/speedup/middleware.rb, line 41 def initialize(rack_body, redirects=[]) @rack_body = rack_body @redirects = redirects end
Public Instance Methods
bar_html()
click to toggle source
# File lib/speedup/middleware.rb, line 89 def bar_html str = "#{styles}" + '<div id="speedup_rails_bar"></div>' + "<script>#{javascript}" + " loadRequestData('#{SpeedupRails::Engine.routes.url_helpers.result_path(Speedup.request.id)}');" @redirects.each_with_index do |req_id, idx| str << " loadRequestData('#{SpeedupRails::Engine.routes.url_helpers.result_path(req_id, redirect: idx)}');" end str << "if( typeof jQuery !== 'undefined' ) { jQuery(document).ajaxComplete(function(evt, xhr, settings){ var request_id = xhr.getResponseHeader('X-Request-Id'); if( request_id && !settings.url.match('#{SpeedupRails::Engine.routes.url_helpers.result_path('')}') ) loadRequestData('#{SpeedupRails::Engine.routes.url_helpers.result_path('REQUEST_ID')}'.replace('REQUEST_ID', request_id)); }); }" str << '</script>' str end
body()
click to toggle source
# File lib/speedup/middleware.rb, line 60 def body @rack_body.body.sub(/<\/body>/, bar_html+'</body>') end
close()
click to toggle source
# File lib/speedup/middleware.rb, line 64 def close @rack_body.close if @rack_body && @rack_body.respond_to?(:close) end
each(*params) { |sub(/<\/body>/, bar_html+'</body>')| ... }
click to toggle source
# File lib/speedup/middleware.rb, line 50 def each(*params, &block) @rack_body.each do |response_row| if response_row =~ /<\/body>/ yield response_row.sub(/<\/body>/, bar_html+'</body>') else yield response_row end end end
render_bar?()
click to toggle source
# File lib/speedup/middleware.rb, line 46 def render_bar? any?{|row| row =~ /<\/body>/ } end
respond_to?(method, include_private = false)
click to toggle source
Calls superclass method
# File lib/speedup/middleware.rb, line 68 def respond_to?(method, include_private = false) if method.to_s == 'to_path' @rack_body.respond_to?(method) else super end end
to_a()
click to toggle source
# File lib/speedup/middleware.rb, line 80 def to_a @rack_body.to_ary end
to_ary()
click to toggle source
# File lib/speedup/middleware.rb, line 84 def to_ary to_a end
to_path()
click to toggle source
# File lib/speedup/middleware.rb, line 76 def to_path @rack_body.to_path end
Private Instance Methods
javascript()
click to toggle source
# File lib/speedup/middleware.rb, line 190 def javascript result = <<-'END_JS' function loadRequestData(url) { speedup_rails_ajax( url , function(xhr) { res = stripScript( xhr.responseText ); appendHtml(document.getElementById('speedup_rails_bar'), res[0]); executeScript(res[1]); }); } function appendHtml(el, str) { var div = document.createElement('div'); div.innerHTML = str; while (div.children.length > 0) { el.appendChild(div.children[0]); } } function stripScript(text) { var scripts = ''; var cleaned = text.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(){ scripts += arguments[1] + '\n'; return ''; }); return [cleaned, scripts]; }; function executeScript(scripts) { if (window.execScript){ window.execScript(scripts); } else { var head = document.getElementsByTagName('head')[0]; var scriptElement = document.createElement('script'); scriptElement.setAttribute('type', 'text/javascript'); scriptElement.innerHTML = scripts; head.appendChild(scriptElement); head.removeChild(scriptElement); } } function speedup_rails_ajax(url, callback) { var xmlhttp; if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } else { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 ) { callback(xmlhttp); } } xmlhttp.open("GET", url, true); xmlhttp.send(); } END_JS result.html_safe end
styles()
click to toggle source
# File lib/speedup/middleware.rb, line 110 def styles <<-END_STYLES <style type="text/css"> #speedup_rails_bar { position: fixed; bottom: 5px; right: 5px; min-width: 250px; z-index: #{Speedup.css[:zindex] || 10}; color: initial; font-family: initial; letter-spacing: initial; } #speedup_rails_bar .redirect { color: #444; } #speedup_rails_bar .speedup_main_bar, #speedup_rails_bar .additional_info { border: 1px solid #c9c9c9; background-color: #EDEAE0; border-radius: 3px; font-size: 14px; overflow: auto; font: normal normal 12px/21px Tahoma, sans-serif; } #speedup_rails_bar > ul.speedup_main_bar { list-style: none; clear: left; margin: 0; padding: 0; margin-left: 4px; overflow: visible; position: relative; height: 22px; } #speedup_rails_bar > ul > li { float: left; padding-left: 5px; } #speedup_rails_bar .additional_info { position: absolute; bottom: 100%; right: 0; padding: 5px; display: none; max-height: 500px; max-width: 200%; overflow: scroll; } #speedup_rails_bar > ul > li:hover .additional_info { display: block; } #speedup_rails_bar li > span { padding: 0 2px; margin-left: 20px; } #speedup_rails_bar .icon_container { position: relative; } #speedup_rails_bar .icon_container img { position: absolute; max-width: 100px; } #speedup_rails_bar .additional_info > div > div { border-bottom: 1px solid #c9c9c9; } #speedup_rails_bar .additional_info > div > div:last-child { border-bottom: none; } #speedup_rails_bar .additional_info .duration { font-weight: bold; } #speedup_rails_bar .additional_info .duration.duration-warning { color: red; } #speedup_rails_bar .additional_info .backtrace { font-size: 95%; margin: 5px 0 0 20px; line-height: 1.4em; } #speedup_rails_bar .additional_info .backtrace .backtrace_line:not(:first-child) { display: none; } </style> END_STYLES end