rack-mini-profiler 0.9.4 → 0.9.9
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rack-mini-profiler might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +42 -1
- data/README.md +50 -25
- data/lib/html/includes.css +12 -0
- data/lib/html/includes.js +53 -18
- data/lib/html/includes.less +17 -3
- data/lib/html/profile_handler.js +1 -1
- data/lib/mini_profiler/asset_version.rb +1 -1
- data/lib/mini_profiler/config.rb +9 -4
- data/lib/mini_profiler/gc_profiler.rb +18 -42
- data/lib/mini_profiler/profiler.rb +113 -89
- data/lib/mini_profiler/profiling_methods.rb +17 -11
- data/lib/mini_profiler/storage/file_store.rb +10 -2
- data/lib/mini_profiler/timer_struct/page.rb +8 -0
- data/lib/mini_profiler/timer_struct/request.rb +8 -0
- data/lib/mini_profiler/timer_struct/sql.rb +2 -2
- data/lib/mini_profiler/version.rb +1 -1
- data/lib/mini_profiler_rails/railtie.rb +23 -5
- data/lib/patches/db/activerecord.rb +2 -0
- data/lib/patches/db/mongo.rb +16 -0
- data/lib/patches/db/neo4j.rb +14 -0
- data/lib/patches/db/nobrainer.rb +29 -0
- data/lib/patches/db/oracle_enhanced.rb +70 -0
- data/lib/patches/db/riak.rb +103 -0
- data/lib/patches/sql_patches.rb +18 -7
- data/rack-mini-profiler.gemspec +1 -1
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 09e877779936ca60a9be72fc14ae574a450cd338
|
4
|
+
data.tar.gz: b53fc49ccabb1d8560c0ee8014199388fbf6749a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a5b9ced034cd204f59eb4be61c718a97960fed72a7e4484af99748b9ed62eb7a736a7ebc78668b46b71f743432c53758ced36f918a1c31859c7f965917f0c826
|
7
|
+
data.tar.gz: 3c97726e0f276ff8b1bd3cf220f64f4b9908ca950b4485f6c9978c05d3479582aa166314e0dbc2afb2c1cb478ebb6801f1459a9cb4bcc51df7cec7826ee96356
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,46 @@
|
|
1
1
|
# CHANGELOG
|
2
|
-
|
2
|
+
|
3
|
+
##
|
4
|
+
|
5
|
+
## 0.9.9 2016-03-06
|
6
|
+
|
7
|
+
- [FIX] removes alias_method_chain in favor of alias_method until Ruby 1.9.3 (@ayfredlund)
|
8
|
+
- [FIX] Dont block mongo when already patched for another db (@rrooding @kbrock)
|
9
|
+
- [FIX] get_profile_script when running under passenger configured with RailsBaseURI (@nspring)
|
10
|
+
- [FEATURE] Add support for neo4j (@ProGM)
|
11
|
+
- [FIX] ArgumentError: comparison of String with 200 failed (@paweljw)
|
12
|
+
- [FEATURE] Add support for Riak (@janx)
|
13
|
+
- [PERF] GC profiler much faster (@dgynn)
|
14
|
+
- [FIX] If local storage is disabled don't bomb out (@elia)
|
15
|
+
- [FIX] Create tmp directory when actually using it (@kbrock)
|
16
|
+
- [ADDED] Default collapse_results setting that collapses multiple timings on same page to a single one (@sam)
|
17
|
+
- [ADDED] Rack::MiniProfiler.profile_singleton_method (@kbrock)
|
18
|
+
- [CHANGE] Added Rack 2.0 support (and dropped support for Rack 1.1) (@dgynn)
|
19
|
+
|
20
|
+
## 0.9.8 - 2015-11-27 (Sam Saffron)
|
21
|
+
|
22
|
+
- [FEATURE] disable_env_dump config setting (@mathias)
|
23
|
+
- [FEATURE] set X-MiniProfiler-Ids for all 2XX reqs (@tymagu2)
|
24
|
+
- [FEATURE] add support for NoBrainer (rethinkdb) profiling (@niv)
|
25
|
+
- [FEATURE] add oracle enhanced adapter profiling (@rrooding)
|
26
|
+
- [FEATURE] pp=profile-memory can now parse query params (@dgynn)
|
27
|
+
|
28
|
+
|
29
|
+
## 0.9.7 - 2015-08-03 (Sam Saffron)
|
30
|
+
|
31
|
+
- [FEATURE] remove confusing pp=profile-gc-time (Nate Berkopec)
|
32
|
+
- [FEATURE] truncate strings in pp=analyze-memory (Nate Berkopec)
|
33
|
+
- [FEATURE] rename pp=profile-gc-ruby-head to pp=profile-memory (Nate Berkopec)
|
34
|
+
|
35
|
+
## 0.9.6 - 2015-07-08 (Sam Saffron)
|
36
|
+
|
37
|
+
- [FIX] incorrect truncation in pp=analyze-memory
|
38
|
+
|
39
|
+
## 0.9.5 - 2015-07-08 (Sam Saffron)
|
40
|
+
|
41
|
+
- [FEATURE] improve pp=analyze-memory
|
42
|
+
|
43
|
+
## 0.9.4 - 2015-07-08 (Sam Saffron)
|
3
44
|
- [UX] added a link to "more" actions in profiler
|
4
45
|
- [FEATURE] pp=help now displays links
|
5
46
|
- [FEATURE] simple memory report with pp=analyze-memory
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@ Middleware that displays speed badge for every html page. Designed to work both
|
|
6
6
|
|
7
7
|
#### Features
|
8
8
|
|
9
|
-
* database profiling. Currently supports Mysql2, Postgres, and Mongoid3 (with fallback support to ActiveRecord)
|
9
|
+
* database profiling. Currently supports Mysql2, Postgres, Oracle (oracle_enhanced ~> 1.5.0) and Mongoid3 (with fallback support to ActiveRecord)
|
10
10
|
|
11
11
|
#### Learn more
|
12
12
|
|
@@ -66,11 +66,17 @@ end
|
|
66
66
|
|
67
67
|
```ruby
|
68
68
|
require 'rack-mini-profiler'
|
69
|
+
|
70
|
+
home = lambda { |env|
|
71
|
+
[200, {'Content-Type' => 'text/html'}, ["<html><body>hello!</body></html>"]]
|
72
|
+
}
|
73
|
+
|
69
74
|
builder = Rack::Builder.new do
|
70
75
|
use Rack::MiniProfiler
|
71
|
-
|
72
|
-
map('/') { run get }
|
76
|
+
map('/') { run home }
|
73
77
|
end
|
78
|
+
|
79
|
+
run builder
|
74
80
|
```
|
75
81
|
|
76
82
|
#### Sinatra
|
@@ -89,20 +95,21 @@ To generate [flamegraphs](http://samsaffron.com/archive/2013/03/19/flame-graphs-
|
|
89
95
|
* add the [**flamegraph**](https://github.com/SamSaffron/flamegraph) gem to your Gemfile
|
90
96
|
* visit a page in your app with `?pp=flamegraph`
|
91
97
|
|
92
|
-
Flamegraph generation is supported in MRI 2.0 and 2.
|
98
|
+
Flamegraph generation is supported in MRI 2.0, 2.1, and 2.2 only.
|
93
99
|
|
94
100
|
|
95
|
-
## Access control in
|
101
|
+
## Access control in non-development environments
|
96
102
|
|
97
103
|
rack-mini-profiler is designed with production profiling in mind. To enable that just run `Rack::MiniProfiler.authorize_request` once you know a request is allowed to profile.
|
98
104
|
|
99
105
|
```ruby
|
100
|
-
#
|
101
|
-
|
102
|
-
|
103
|
-
|
106
|
+
# inside your ApplicationController
|
107
|
+
|
108
|
+
before_action do
|
109
|
+
if current_user && current_user.is_admin?
|
110
|
+
Rack::MiniProfiler.authorize_request
|
111
|
+
end
|
104
112
|
end
|
105
|
-
end
|
106
113
|
```
|
107
114
|
|
108
115
|
## Configuration
|
@@ -121,7 +128,7 @@ To disable this behavior, use the following config setting:
|
|
121
128
|
|
122
129
|
```ruby
|
123
130
|
# Do not let rack-mini-profiler disable caching
|
124
|
-
Rack::MiniProfiler.config.disable_caching = false # defaults to true
|
131
|
+
Rack::MiniProfiler.config.disable_caching = false # defaults to true
|
125
132
|
```
|
126
133
|
|
127
134
|
### Storage
|
@@ -144,11 +151,11 @@ if Rails.env.production?
|
|
144
151
|
end
|
145
152
|
```
|
146
153
|
|
147
|
-
MemoryStore stores results in a processes heap - something that does not work well in a multi process environment.
|
148
|
-
FileStore stores results in the file system - something that may not work well in a multi machine environment.
|
149
|
-
RedisStore
|
154
|
+
`MemoryStore` stores results in a processes heap - something that does not work well in a multi process environment.
|
155
|
+
`FileStore` stores results in the file system - something that may not work well in a multi machine environment.
|
156
|
+
`RedisStore`/`MemcacheStore` work in multi process and multi machine environments (`RedisStore` only saves results for up to 24 hours so it won't continue to fill up Redis).
|
150
157
|
|
151
|
-
Additionally you may implement an AbstractStore for your own provider.
|
158
|
+
Additionally you may implement an `AbstractStore` for your own provider.
|
152
159
|
|
153
160
|
### User result segregation
|
154
161
|
|
@@ -166,6 +173,17 @@ Rack::MiniProfiler.config.user_provider = Proc.new{ |env| CurrentUser.get(env) }
|
|
166
173
|
|
167
174
|
The string this function returns should be unique for each user on the system (for anonymous you may need to fall back to ip address)
|
168
175
|
|
176
|
+
### Profiling specific methods
|
177
|
+
|
178
|
+
You can increase the granularity of profiling by measuring the performance of specific methods. Add methods of interest to an initializer.
|
179
|
+
|
180
|
+
```ruby
|
181
|
+
Rails.application.config.to_prepare do
|
182
|
+
::Rack::MiniProfiler.profile_singleton_method(User, :non_admins) { |a| "executing all_non_admins" }
|
183
|
+
::Rack::MiniProfiler.profile_method(User, :favorite_post) { |a| "executing favorite_post" }
|
184
|
+
end
|
185
|
+
```
|
186
|
+
|
169
187
|
### Configuration Options
|
170
188
|
|
171
189
|
You can set configuration options using the configuration accessor on `Rack::MiniProfiler`.
|
@@ -177,16 +195,23 @@ Rack::MiniProfiler.config.start_hidden = true
|
|
177
195
|
```
|
178
196
|
The available configuration options are:
|
179
197
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
198
|
+
Option|Default|Description
|
199
|
+
-------|---|--------
|
200
|
+
pre_authorize_cb|Rails: dev only<br>Rack: always on|A lambda callback that returns true to make mini_profiler visible on a given request.
|
201
|
+
position|`'left'`|Display mini_profiler on `'right'` or `'left'`.
|
202
|
+
skip_paths|`[]`|Paths that skip profiling.
|
203
|
+
skip_schema_queries|Rails dev: `'true'`<br>Othwerwise: `'false'`|`'true'` to log schema queries.
|
204
|
+
auto_inject|`true`|`true` to inject the miniprofiler script in the page.
|
205
|
+
backtrace_ignores|`[]`|Regexes of lines to be removed from backtraces.
|
206
|
+
backtrace_includes|Rails: `[/^\/?(app|config|lib|test)/]`<br>Rack: `[]`|Regexes of lines to keep in backtraces.
|
207
|
+
backtrace_remove|rails: `Rails.root`<br>Rack: `nil`|A string or regex to remove part of each line in the backtrace.
|
208
|
+
toggle_shortcut|Alt+P|Keyboard shortcut to toggle the mini_profiler's visibility. See [jquery.hotkeys](https://github.com/jeresig/jquery.hotkeys).
|
209
|
+
start_hidden|`false`|`false` to make mini_profiler visible on page load.
|
210
|
+
backtrace_threshold_ms|`0`|Minimum SQL query elapsed time before a backtrace is recorded. Backtrace recording can take a couple of milliseconds on rubies earlier than 2.0, impacting performance for very small queries.
|
211
|
+
flamegraph_sample_rate|`0.5ms`|How often to capture stack traces for flamegraphs.
|
212
|
+
disable_env_dump|`false`|`true` disables `?pp=env`, which prevents sending ENV vars over HTTP.
|
213
|
+
base_url_path|`'/mini-profiler-resources/'`|Path for assets; added as a prefix when naming assets and sought when responding to requests.
|
214
|
+
collapse_results|`true`|If multiple timing results exist in a single page, collapse them till clicked.
|
190
215
|
|
191
216
|
### Custom middleware ordering (required if using `Rack::Deflate` with Rails)
|
192
217
|
|
data/lib/html/includes.css
CHANGED
@@ -267,6 +267,7 @@
|
|
267
267
|
.profiler-results.profiler-left {
|
268
268
|
left: 0px;
|
269
269
|
}
|
270
|
+
.profiler-results.profiler-left.profiler-no-controls .profiler-totals,
|
270
271
|
.profiler-results.profiler-left.profiler-no-controls .profiler-result:last-child .profiler-button,
|
271
272
|
.profiler-results.profiler-left .profiler-controls {
|
272
273
|
-webkit-border-bottom-right-radius: 10px;
|
@@ -280,6 +281,7 @@
|
|
280
281
|
.profiler-results.profiler-right {
|
281
282
|
right: 0px;
|
282
283
|
}
|
284
|
+
.profiler-results.profiler-right.profiler-no-controls .profiler-totals,
|
283
285
|
.profiler-results.profiler-right.profiler-no-controls .profiler-result:last-child .profiler-button,
|
284
286
|
.profiler-results.profiler-right .profiler-controls {
|
285
287
|
-webkit-border-bottom-left-radius: 10px;
|
@@ -316,6 +318,16 @@
|
|
316
318
|
color: #fff;
|
317
319
|
font-weight: normal;
|
318
320
|
}
|
321
|
+
.profiler-results .profiler-totals .profiler-reqs {
|
322
|
+
font-family: Consolas, monospace, serif;
|
323
|
+
font-size: 10px;
|
324
|
+
margin-left: 6px;
|
325
|
+
}
|
326
|
+
.profiler-results .profiler-totals .profiler-reqs:before {
|
327
|
+
font-family: Consolas, monospace, serif;
|
328
|
+
content: "×";
|
329
|
+
margin-right: 1px;
|
330
|
+
}
|
319
331
|
.profiler-results .profiler-controls {
|
320
332
|
display: block;
|
321
333
|
font-size: 12px;
|
data/lib/html/includes.js
CHANGED
@@ -10,9 +10,12 @@ var MiniProfiler = (function () {
|
|
10
10
|
ajaxStartTime
|
11
11
|
;
|
12
12
|
|
13
|
-
var hasLocalStorage = function () {
|
13
|
+
var hasLocalStorage = function (keyPrefix) {
|
14
14
|
try {
|
15
|
-
|
15
|
+
// attempt to save to localStorage as Safari private windows will throw an error
|
16
|
+
localStorage[keyPrefix+'-test'] = '1';
|
17
|
+
localStorage.removeItem(keyPrefix+'-test');
|
18
|
+
return 'localStorage' in window && window['localStorage'] !== null ;
|
16
19
|
} catch (e) {
|
17
20
|
return false;
|
18
21
|
}
|
@@ -23,7 +26,7 @@ var MiniProfiler = (function () {
|
|
23
26
|
};
|
24
27
|
|
25
28
|
var save = function (keyPrefix, value) {
|
26
|
-
if (!hasLocalStorage()) { return; }
|
29
|
+
if (!hasLocalStorage(keyPrefix)) { return; }
|
27
30
|
|
28
31
|
// clear old keys with this prefix, if any
|
29
32
|
for (var i = 0; i < localStorage.length; i++) {
|
@@ -37,7 +40,7 @@ var MiniProfiler = (function () {
|
|
37
40
|
};
|
38
41
|
|
39
42
|
var load = function (keyPrefix) {
|
40
|
-
if (!hasLocalStorage()) { return null; }
|
43
|
+
if (!hasLocalStorage(keyPrefix)) { return null; }
|
41
44
|
|
42
45
|
return localStorage[getVersionedKey(keyPrefix)];
|
43
46
|
};
|
@@ -62,7 +65,7 @@ var MiniProfiler = (function () {
|
|
62
65
|
};
|
63
66
|
|
64
67
|
var getClientPerformance = function() {
|
65
|
-
return window.performance
|
68
|
+
return window.performance === null ? null : window.performance;
|
66
69
|
};
|
67
70
|
|
68
71
|
var fetchResults = function (ids) {
|
@@ -86,7 +89,7 @@ var MiniProfiler = (function () {
|
|
86
89
|
|
87
90
|
clientPerformance = getClientPerformance();
|
88
91
|
|
89
|
-
if (clientPerformance
|
92
|
+
if (clientPerformance !== null) {
|
90
93
|
// ie is buggy strip out functions
|
91
94
|
var copy = { navigation: {}, timing: {} };
|
92
95
|
|
@@ -114,7 +117,7 @@ var MiniProfiler = (function () {
|
|
114
117
|
|
115
118
|
}
|
116
119
|
}
|
117
|
-
} else if (ajaxStartTime
|
120
|
+
} else if (ajaxStartTime !== null && clientProbes && clientProbes.length > 0) {
|
118
121
|
clientPerformance = { timing: { navigationStart: ajaxStartTime.getTime() } };
|
119
122
|
ajaxStartTime = null;
|
120
123
|
}
|
@@ -146,9 +149,39 @@ var MiniProfiler = (function () {
|
|
146
149
|
return $('#profilerTemplate').tmpl(json);
|
147
150
|
};
|
148
151
|
|
152
|
+
var totalsControl;
|
153
|
+
var reqs = 0;
|
154
|
+
var totalTime = 0;
|
155
|
+
|
149
156
|
var buttonShow = function (json) {
|
150
157
|
var result = renderTemplate(json);
|
151
158
|
|
159
|
+
totalTime += parseFloat(json.duration_milliseconds, 10);
|
160
|
+
reqs++;
|
161
|
+
|
162
|
+
if (!controls && reqs > 1 && options.collapseResults) {
|
163
|
+
if (!totalsControl) {
|
164
|
+
container.find('.profiler-result').hide();
|
165
|
+
|
166
|
+
totalsControl = $("<div class='profiler-result'><div class='profiler-button profiler-totals'></div></div>");
|
167
|
+
totalsControl.appendTo(container);
|
168
|
+
totalsControl.click(function(){
|
169
|
+
totalsControl.parent().find('.profiler-result').show();
|
170
|
+
totalsControl.hide();
|
171
|
+
options.collapseResults = false;
|
172
|
+
});
|
173
|
+
|
174
|
+
totalsControl.find('.profiler-button').show();
|
175
|
+
}
|
176
|
+
|
177
|
+
var reqsHtml = reqs > 1 ? ("<span class='profiler-reqs'>" + reqs + "</span>") : "";
|
178
|
+
totalsControl.find('.profiler-button').html("<span class='profiler-number'>" +
|
179
|
+
totalTime.toFixed(1) + "</span> <span class='profiler-unit'>ms</span>" +
|
180
|
+
reqsHtml);
|
181
|
+
|
182
|
+
result.hide();
|
183
|
+
}
|
184
|
+
|
152
185
|
if (controls)
|
153
186
|
result.insertBefore(controls);
|
154
187
|
else
|
@@ -480,7 +513,7 @@ var MiniProfiler = (function () {
|
|
480
513
|
PageRequestManager.add_endRequest(function (sender, args) {
|
481
514
|
if (args) {
|
482
515
|
var response = args.get_response();
|
483
|
-
if (response.get_responseAvailable() && response._xmlHttpRequest
|
516
|
+
if (response.get_responseAvailable() && response._xmlHttpRequest !== null) {
|
484
517
|
var stringIds = args.get_response().getResponseHeader('X-MiniProfiler-Ids');
|
485
518
|
if (stringIds) {
|
486
519
|
var ids = typeof JSON != 'undefined' ? JSON.parse(stringIds) : eval(stringIds);
|
@@ -557,14 +590,14 @@ var MiniProfiler = (function () {
|
|
557
590
|
}
|
558
591
|
}
|
559
592
|
|
560
|
-
if (this.miniprofiler.prev_onreadystatechange
|
593
|
+
if (this.miniprofiler.prev_onreadystatechange !== null)
|
561
594
|
return this.miniprofiler.prev_onreadystatechange.apply(this, arguments);
|
562
595
|
};
|
563
596
|
}
|
564
597
|
}
|
565
598
|
|
566
599
|
return _send.apply(this, arguments);
|
567
|
-
}
|
600
|
+
};
|
568
601
|
}
|
569
602
|
|
570
603
|
// some elements want to be hidden on certain doc events
|
@@ -594,11 +627,12 @@ var MiniProfiler = (function () {
|
|
594
627
|
var maxTraces = parseInt(script.getAttribute('data-max-traces'), 10);
|
595
628
|
}
|
596
629
|
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
630
|
+
var collapseResults = script.getAttribute('data-collapse-results') === 'true';
|
631
|
+
var trivial = script.getAttribute('data-trivial') === 'true';
|
632
|
+
var children = script.getAttribute('data-children') === 'true';
|
633
|
+
var controls = script.getAttribute('data-controls') === 'true';
|
634
|
+
var authorized = script.getAttribute('data-authorized') === 'true';
|
635
|
+
var startHidden = script.getAttribute('data-start-hidden') === 'true';
|
602
636
|
|
603
637
|
return {
|
604
638
|
ids: ids,
|
@@ -612,7 +646,8 @@ var MiniProfiler = (function () {
|
|
612
646
|
currentId: currentId,
|
613
647
|
authorized: authorized,
|
614
648
|
toggleShortcut: toggleShortcut,
|
615
|
-
startHidden: startHidden
|
649
|
+
startHidden: startHidden,
|
650
|
+
collapseResults: collapseResults
|
616
651
|
};
|
617
652
|
})();
|
618
653
|
|
@@ -842,7 +877,7 @@ var MiniProfiler = (function () {
|
|
842
877
|
var processTimes = function (elem, parent) {
|
843
878
|
var duration = { start: elem.start_milliseconds, finish: (elem.start_milliseconds + elem.duration_milliseconds) };
|
844
879
|
elem.richTiming = [duration];
|
845
|
-
if (parent
|
880
|
+
if (parent !== null) {
|
846
881
|
elem.parent = parent;
|
847
882
|
elem.parent.richTiming = removeDuration(elem.parent.richTiming, duration);
|
848
883
|
}
|
@@ -877,7 +912,7 @@ var MiniProfiler = (function () {
|
|
877
912
|
|
878
913
|
var determineGap = function (gap, node, match) {
|
879
914
|
var overlap = determineOverlap(gap, node);
|
880
|
-
if (match
|
915
|
+
if (match === null || overlap > match.duration) {
|
881
916
|
match = { name: node.name, duration: overlap };
|
882
917
|
}
|
883
918
|
else if (match.name == node.name) {
|
data/lib/html/includes.less
CHANGED
@@ -247,7 +247,7 @@
|
|
247
247
|
}
|
248
248
|
|
249
249
|
// ajaxed-in results will be appended to this
|
250
|
-
.profiler-results
|
250
|
+
.profiler-results
|
251
251
|
{
|
252
252
|
z-index:@zindex + 3;
|
253
253
|
position:fixed;
|
@@ -258,7 +258,7 @@
|
|
258
258
|
&.profiler-left {
|
259
259
|
left:0px;
|
260
260
|
|
261
|
-
&.profiler-no-controls .profiler-result:last-child .profiler-button, .profiler-controls {
|
261
|
+
&.profiler-no-controls .profiler-totals, &.profiler-no-controls .profiler-result:last-child .profiler-button, .profiler-controls {
|
262
262
|
-webkit-border-bottom-right-radius: @radius;
|
263
263
|
-moz-border-radius-bottomright: @radius;
|
264
264
|
border-bottom-right-radius: @radius;
|
@@ -272,7 +272,7 @@
|
|
272
272
|
&.profiler-right {
|
273
273
|
right:0px;
|
274
274
|
|
275
|
-
&.profiler-no-controls .profiler-result:last-child .profiler-button, .profiler-controls {
|
275
|
+
&.profiler-no-controls .profiler-totals, &.profiler-no-controls .profiler-result:last-child .profiler-button, .profiler-controls {
|
276
276
|
-webkit-border-bottom-left-radius: @radius;
|
277
277
|
-moz-border-radius-bottomleft: @radius;
|
278
278
|
border-bottom-left-radius: @radius;
|
@@ -306,6 +306,20 @@
|
|
306
306
|
}
|
307
307
|
}
|
308
308
|
|
309
|
+
|
310
|
+
.profiler-totals {
|
311
|
+
.profiler-reqs {
|
312
|
+
font-family: @codeFonts;
|
313
|
+
font-size: 10px;
|
314
|
+
margin-left: 6px;
|
315
|
+
&:before {
|
316
|
+
font-family: @codeFonts;
|
317
|
+
content: "×";
|
318
|
+
margin-right: 1px;
|
319
|
+
}
|
320
|
+
}
|
321
|
+
}
|
322
|
+
|
309
323
|
.profiler-controls {
|
310
324
|
display: block;
|
311
325
|
font-size:12px;
|
data/lib/html/profile_handler.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
<script async type="text/javascript" id="mini-profiler" src="{path}includes.js?v={version}" data-version="{version}" data-path="{path}" data-current-id="{currentId}" data-ids="{ids}" data-position="{position}" data-trivial="{showTrivial}" data-children="{showChildren}" data-max-traces="{maxTracesToShow}" data-controls="{showControls}" data-authorized="{authorized}" data-toggle-shortcut="{toggleShortcut}" data-start-hidden="{startHidden}"></script>
|
1
|
+
<script async type="text/javascript" id="mini-profiler" src="{path}includes.js?v={version}" data-version="{version}" data-path="{path}" data-current-id="{currentId}" data-ids="{ids}" data-position="{position}" data-trivial="{showTrivial}" data-children="{showChildren}" data-max-traces="{maxTracesToShow}" data-controls="{showControls}" data-authorized="{authorized}" data-toggle-shortcut="{toggleShortcut}" data-start-hidden="{startHidden}" data-collapse-results="{collapseResults}"></script>
|