rack-mini-profiler 0.9.4 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>
|