PluginProbe
Code Profiler – WordPress Performance Profiling and Debugging Made Easy / 1.9.6
Code Profiler – WordPress Performance Profiling and Debugging Made Easy v1.9.6
1.9.6 1.9.5 1.9.4 1.9.3 trunk 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.6 1.6.1 1.6.10 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 All 41 releases
← All changes | static/code-profiler.js +355 -70 1.41.9.6 View file →
@@ -5,9 +5,9 @@
5 5 | | | / _ \ / _` |/ _ \ | |_) | '__/ _ \| |_| | |/ _ \ '__| |
6 6 | | |__| (_) | (_| | __/ | __/| | | (_) | _| | | __/ | |
7 7 | \____\___/ \__,_|\___| |_| |_| \___/|_| |_|_|\___|_| |
8 8 | |
9 - | (c) Jerome Bruandet ~ https://code-profiler.com/ |
9 + | (c) Jerome Bruandet ~ https://nintechnet.com/codeprofiler/ |
10 10 +=====================================================================+
11 11 */
12 12
13 13 // =====================================================================
@@ -15,9 +15,9 @@
15 15
16 16 // TipTip tooltip
17 17 jQuery( document ).ready(function( $ ) {
18 18 'use strict';
19 - $( '.code-profiler-tip' ).tipTip( {
19 + $('.code-profiler-tip').tipTip( {
20 20 'attribute': 'data-tip',
21 21 'fadeIn': 50,
22 22 'fadeOut': 50,
23 23 'delay': 100,
@@ -28,9 +28,9 @@
28 28 // if the user reloaded the page that would throw an error:
29 29 var url = window.location.href;
30 30 window.history.replaceState({},
31 31 document.title,
32 - url.replace( /&action=delete_profiles&.+/, '' )
32 + url.replace( /&action=delete_profiles&.+/, '')
33 33 );
34 34
35 35 });
36 36
@@ -44,21 +44,21 @@
44 44 // Case sensitivity
45 45 if ( jQuery('#case-search-input').is(':checked') === true ) {
46 46 query += '&c=1';
47 47 }
48 - jQuery("#profile-form").attr('action', jQuery("#profile-form").attr('action')+ query );
48 + jQuery('#profile-form').attr('action', jQuery('#profile-form').attr('action')+ query );
49 49
50 50 } else {
51 - jQuery("#profile-form").attr('action','' );
51 + jQuery('#profile-form').attr('action','');
52 52 var url = window.location.href;
53 53 window.history.replaceState({},
54 54 document.title,
55 - url.replace( /&s=[^&$]+/, '' )
55 + url.replace( /&s=[^&$]+/, '')
56 56 );
57 57 var url = window.location.href;
58 58 window.history.replaceState({},
59 59 document.title,
60 - url.replace( /&c=1/, '' )
60 + url.replace( /&c=1/, '')
61 61 );
62 62 }
63 63 }
64 64
@@ -68,30 +68,106 @@
68 68 function cpjs_front_or_backend( item ) {
69 69 'use strict';
70 70 // Enable/disable frontend/backend select box
71 71 // depending on user's choice
72 - if ( item == 1 ) {
73 - jQuery('#id-frontend').prop('disabled', false);
72 + if ( item == 'frontend') {
73 + jQuery('#p-frontend').show();
74 + jQuery('#p-backend').hide();
75 + jQuery('#p-custom').hide();
76 + jQuery('#p-wpcron').hide();
74 77 jQuery('#id-frontend').focus();
75 - jQuery('#id-backend').prop('disabled', true);
76 - jQuery('#id-custom').prop('disabled', true);
77 78 jQuery('#user-unauthenticated').prop('disabled', false);
78 - } else if ( item == 2 ) {
79 - jQuery('#id-backend').prop('disabled', false);
79 + jQuery('#user-authenticated').prop('disabled', false);
80 + } else if ( item == 'backend') {
81 + jQuery('#p-backend').show();
82 + jQuery('#p-frontend').hide();
83 + jQuery('#p-custom').hide();
84 + jQuery('#p-wpcron').hide();
80 85 jQuery('#id-backend').focus();
81 - jQuery('#id-frontend').prop('disabled', true);
82 - jQuery('#id-custom').prop('disabled', true);
83 86 jQuery('#user-unauthenticated').prop('disabled', true);
84 - jQuery('#user-authenticated').prop('checked', true)
87 + jQuery('#user-authenticated').prop('disabled', false);
88 + jQuery('#user-authenticated').prop('checked', true);
89 + jQuery('#user-name').prop('disabled', false);
90 + } else if ( item == 'custom') {
91 + jQuery('#p-custom').show();
92 + jQuery('#p-frontend').hide();
93 + jQuery('#p-backend').hide();
94 + jQuery('#p-wpcron').hide();
95 + jQuery('#id-custom').focus();
96 + jQuery('#user-unauthenticated').prop('disabled', false);
97 + jQuery('#user-authenticated').prop('disabled', false);
85 98 } else {
86 - jQuery('#id-custom').prop('disabled', false);
87 - jQuery('#id-custom').focus();
88 - jQuery('#id-backend').prop('disabled', true);
89 - jQuery('#id-frontend').prop('disabled', true);
99 + jQuery('#p-wpcron').show();
100 + jQuery('#p-custom').hide();
101 + jQuery('#p-frontend').hide();
102 + jQuery('#p-backend').hide();
103 + jQuery('#id-wpcron').focus();
90 104 jQuery('#user-unauthenticated').prop('disabled', false);
91 105 }
92 106 }
93 107
108 +function cpjs_authenticated( id ) {
109 + if ( id == 1 ) {
110 + jQuery('#user-name').prop('disabled', false);
111 + jQuery('#user-name').focus();
112 + } else {
113 + jQuery('#user-name').prop('disabled', true);
114 + }
115 +}
116 +
117 +function cpjs_show_adv_settings() {
118 + jQuery('#cp-advanced-settings').slideDown();
119 + jQuery('#button-adv-settings').prop('disabled', true);
120 +}
121 +
122 +function cpjs_get_post( id ) {
123 + if ( id == 1 ) {
124 + jQuery('#post-value').prop('disabled', false);
125 + jQuery('#id-content-type').prop('disabled', false);
126 + jQuery('#post-value').focus();
127 + } else {
128 + jQuery('#post-value').prop('disabled', true);
129 + jQuery('#id-content-type').prop('disabled', true);
130 + }
131 +}
132 +
133 +function cpjs_content_type( value ) {
134 + if ( value == 1 ) {
135 + jQuery('#ct-1').slideDown();
136 + jQuery('#ct-3').slideUp();
137 + jQuery('#ct-2').slideUp();
138 + } else if ( value == 2 ) {
139 + jQuery('#ct-2').slideDown();
140 + jQuery('#ct-3').slideUp();
141 + jQuery('#ct-1').slideUp();
142 + } else {
143 + jQuery('#ct-3').slideDown();
144 + jQuery('#ct-1').slideUp();
145 + jQuery('#ct-2').slideUp();
146 + }
147 +}
148 +
149 +function cpjs_isJSON( data ) {
150 +
151 + if ( jQuery('#id-content-type').val() == 1 || jQuery('#get-method').prop('checked') == true ) {
152 + // Ignore
153 + return 1;
154 + }
155 + try {
156 + return JSON.parse( data );
157 + } catch (e) {
158 + // Not a JSON-encoded string
159 + return null;
160 + }
161 +}
162 +
163 +function cpjs_ismultiline( data ) {
164 + if ( data.match( /[\n\r]/) ) {
165 + return true;
166 + }
167 + return false;
168 +}
169 +
94 170 // =====================================================================
95 171 // Log page: filter and delete the log.
96 172
97 173 function cpjs_filter_log() {
@@ -100,8 +176,9 @@
100 176 var bitmask = 0;
101 177 if ( document.cplogform.info.checked == true ) { bitmask += 1; }
102 178 if ( document.cplogform.warn.checked == true ) { bitmask += 2; }
103 179 if ( document.cplogform.error.checked == true ) { bitmask += 4; }
180 + if ( document.cplogform.debug.checked == true ) { bitmask += 8; }
104 181
105 182 // Clear the textarea
106 183 document.cplogform.cptxtlog.value = '';
107 184
@@ -109,9 +186,9 @@
109 186 var cp_count = 0;
110 187 var i = 0;
111 188 for ( i = 0; i < cplog_array.length; ++i ) {
112 189 var line = decodeURIComponent( cplog_array[i] );
113 - var line_array = line.split( '~~', 2 );
190 + var line_array = line.split('~~', 2 );
114 191 if ( line_array[0] & bitmask ) {
115 192 document.cplogform.cptxtlog.value += line_array[1];
116 193 ++cp_count;
117 194 }
@@ -131,12 +208,18 @@
131 208 // =====================================================================
132 209 // AJAX call to start the profiler.
133 210
134 211 function cpjs_start_profiler() {
212 +
135 213 'use strict';
214 +
215 + jQuery('html, body').animate( {
216 + scrollTop: jQuery('#button-adv-settings').offset().top
217 + }, 1000 );
218 +
136 219 // Get the nonce
137 220 var cp_nonce = jQuery('#cp_nonce').val();
138 - if ( cp_nonce == '' ) {
221 + if ( cp_nonce == '') {
139 222 alert( cpi18n.missing_nonce );
140 223 return;
141 224 }
142 225
@@ -141,23 +224,30 @@
141 224 }
142 225
143 226 // Get the scan type (frontend/backend)
144 227 var post;
145 - var where = jQuery('input[name="where"]:checked').val();
146 - if ( where == 'frontend' ) {
228 + var x_end = jQuery('input[name="x_end"]:checked').val();
229 + if ( x_end == 'frontend') {
147 230 post = jQuery('#id-frontend').val();
148 231
149 - } else if ( where == 'backend' ) {
232 + } else if ( x_end == 'backend') {
150 233 post = jQuery('#id-backend').val();
151 234
152 - } else if ( where == 'custom' ) {
235 + } else if ( x_end == 'custom') {
153 236 post = jQuery('#id-custom').val().trim(); // Trim user input
154 237
238 + } else if ( x_end == 'wpcron') {
239 + post = jQuery('#id-wpcron').val();
240 + if ( post == 0 ) {
241 + alert( cpi18n.missing_wpcron );
242 + return;
243 + }
244 +
155 245 } else {
156 246 alert( cpi18n.missing_frontbackend );
157 247 return;
158 248 }
159 - if ( post == '' ) {
249 + if ( post == '') {
160 250 alert( cpi18n.missing_post );
161 251 return;
162 252 }
163 253
@@ -162,25 +252,68 @@
162 252 }
163 253
164 254 // Get the profile's name
165 255 var profile = jQuery('input[name="profile"]').val();
166 - if ( profile == '' ) {
256 + if ( profile == '') {
167 257 alert( cpi18n.missing_profilename );
168 258 jQuery('input[name="profile"]').focus();
169 259 return;
170 260 }
171 261
172 - var user = jQuery('input[name="user"]:checked').val();
173 - if ( user == '' ) {
262 + var x_auth = jQuery('input[name="x_auth"]:checked').val();
263 + if ( x_auth == '') {
174 264 alert( cpi18n.missing_userauth );
175 265 return;
176 266 }
177 267
178 - var ua = jQuery('#ua-id').val();
179 - if ( ua == 'undefined' ) {
180 - ua = 'FireFox';
268 + var username = jQuery('#user-name').val().trim(); // Trim user input
269 + if ( x_auth == 'authenticated') {
270 + if ( username == '') {
271 + alert( cpi18n.missing_username );
272 + jQuery('#user-name').focus();
273 + return;
274 + }
181 275 }
182 276
277 + var user_agent = jQuery('#ua-id').val();
278 + if ( user_agent == 'undefined') {
279 + user_agent = 'FireFox';
280 + }
281 +
282 + var theme = jQuery('#id-theme').val();
283 +
284 + // GET or POST
285 + var method = jQuery('input[name="method"]:checked').val();
286 + var payload = '';
287 + if ( method == 'post') {
288 + // Payload
289 + payload = jQuery('#post-value').val();
290 + } else {
291 + method = 'get';
292 + }
293 +
294 + //Content type
295 + var ct = jQuery('#id-content-type').val();
296 + if ( ct == 2 ) {
297 + // application/json
298 + if ( cpjs_isJSON( payload ) == null ) {
299 + alert( cpi18n.missing_ajax );
300 + jQuery('#user-name').focus();
301 + return;
302 + }
303 + } else if ( ct == 3 ) {
304 + // Raw format must be on one single line
305 + if ( cpjs_ismultiline( payload.trim() ) == true ) {
306 + alert( cpi18n.multiline_raw );
307 + jQuery('#post-value').focus();
308 + return;
309 + }
310 + }
311 +
312 + var cookies = jQuery('#cp-cookies').val();
313 + var headers = jQuery('#custom-headers').val();
314 + var exclusions = jQuery('#exclusions').val();
315 +
183 316 // Change buttons status and add animated image with status message
184 317 jQuery('#start-profile').prop('disabled', true);
185 318 jQuery('#cp-progress-div').slideDown();
186 319 jQuery('#progress-gif').slideDown();
@@ -190,17 +323,25 @@
190 323
191 324 var data = {
192 325 'action': 'codeprofiler_start_profiler',
193 326 'cp_nonce': cp_nonce,
194 - 'where': where,
327 + 'x_end': x_end,
195 328 'post': post,
329 + 'content_type': ct,
196 330 'profile': profile,
197 - 'user': user,
198 - 'ua': ua
331 + 'x_auth': x_auth,
332 + 'username': username,
333 + 'cookies': cookies,
334 + 'custom_headers': headers,
335 + 'exclusions': exclusions,
336 + 'method': method,
337 + 'payload': payload,
338 + 'user_agent': user_agent,
339 + 'theme': theme
199 340 };
200 341 // Send the request via AJAX
201 342 jQuery.ajax( {
202 - type: "POST",
343 + type: 'POST',
203 344 url: ajaxurl,
204 345 data: data,
205 346 dataType: 'json',
206 347 success: function( response ) {
@@ -205,14 +346,14 @@
205 346 dataType: 'json',
206 347 success: function( response ) {
207 348
208 349 if (typeof response === 'undefined') {
209 - cpjs_start_error( '<p>'+ cpi18n.unknown_error +'</p>' );
350 + cpjs_start_error('<p>'+ cpi18n.unknown_error +'</p>');
210 351 return;
211 352 }
212 353
213 - if ( response.status != 'success' ) {
214 - cpjs_start_error( '<p>'+ response.message +'</p>' );
354 + if ( response.status != 'success') {
355 + cpjs_start_error('<p>'+ response.message +'</p>');
215 356 return;
216 357 }
217 358
218 359 // ------------------------------------------------------------
@@ -222,9 +363,9 @@
222 363
223 364 data['action'] = 'codeprofiler_prepare_report';
224 365 data['microtime'] = response.microtime;
225 366 jQuery.ajax( {
226 - type: "POST",
367 + type: 'POST',
227 368 url: ajaxurl,
228 369 data: data,
229 370 dataType: 'json',
230 371 success: function( response ) {
@@ -229,18 +370,18 @@
229 370 dataType: 'json',
230 371 success: function( response ) {
231 372
232 373 if (typeof response === 'undefined') {
233 - cpjs_start_error( '<p>'+ cpi18n.unknown_error +'</p>' );
374 + cpjs_start_error('<p>'+ cpi18n.unknown_error +'</p>');
234 375 return;
235 376 }
236 377
237 - if ( response.status != 'success' ) {
238 - cpjs_start_error( '<p>'+ response.message +'</p>' );
378 + if ( response.status != 'success') {
379 + cpjs_start_error('<p>'+ response.message +'</p>');
239 380 return;
240 381 }
241 382 var cp_uri;
242 - if (response.cp_profile !== 'undefined' && response.cp_profile != '' ) {
383 + if (response.cp_profile !== 'undefined' && response.cp_profile != '') {
243 384 cp_uri = '&cptab=profiles_list&action=view_profile&id=' + response.cp_profile + '&section=1';
244 385 } else {
245 386 cp_uri = '&cptab=profiles_list';
246 387 }
@@ -253,16 +394,30 @@
253 394 },
254 395
255 396 // Display non-200 HTTP response
256 397 error: function( xhr, status, err ) {
257 - if ( err != '' ) {
258 -
398 + if ( err != '') {
259 399 if ( xhr.status != 0 ) {
260 - cpjs_start_error( '<p>'+ cpi18n.http_error +' '+ xhr.status +' '+ err +'.</p>' );
400 + var message = cpi18n.http_error +' '+ xhr.status +' '+ err;
401 + // Timeout
402 + if ( xhr.status == 503 || xhr.status == 504 ) {
403 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.timeout_error +'.</p>');
404 + // Redirections, not found
405 + } else if ( xhr.status == 301 || xhr.status == 302 || xhr.status == 404 ) {
406 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.notfound_error +'.</p>');
407 + // Forbidden
408 + } else if ( xhr.status == 403 ) {
409 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.forbidden_error +'.</p>');
410 + // Internal error
411 + } else if ( xhr.status == 500 ) {
412 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.internal_error +'.<br />'+ cpi18n.timeout_error +'.</p>');
413 + } else {
414 + cpjs_start_error('<p>'+ cpi18n.http_error +' '+ xhr.status +' '+ err +'.</p>');
415 + }
261 416 return;
262 417
263 418 } else {
264 - cpjs_start_error( '<p>'+ cpi18n.unknown_error +' '+ err +'.</p>' );
419 + cpjs_start_error('<p>'+ cpi18n.unknown_error +' '+ err +'.</p>');
265 420 return;
266 421 }
267 422 }
268 423 return;
@@ -272,16 +427,30 @@
272 427 },
273 428
274 429 // Display non-200 HTTP response
275 430 error: function( xhr, status, err ) {
276 - if ( err != '' ) {
277 -
431 + if ( err != '') {
278 432 if ( xhr.status != 0 ) {
279 - cpjs_start_error( '<p>'+ cpi18n.http_error +' '+ xhr.status +' '+ err +'.</p>' );
433 + var message = cpi18n.http_error +' '+ xhr.status +' '+ err;
434 + // Timeout
435 + if ( xhr.status == 503 || xhr.status == 504 ) {
436 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.timeout_error +'.</p>');
437 + // Redirections, not found
438 + } else if ( xhr.status == 301 || xhr.status == 302 || xhr.status == 404 ) {
439 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.notfound_error +'.</p>');
440 + // Forbidden
441 + } else if ( xhr.status == 403 ) {
442 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.forbidden_error +'.</p>');
443 + // Internal error
444 + } else if ( xhr.status == 500 ) {
445 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.internal_error +'.<br />'+ cpi18n.timeout_error +'.</p>');
446 + } else {
447 + cpjs_start_error('<p>'+ cpi18n.http_error +' '+ xhr.status +' '+ err +'.</p>');
448 + }
280 449 return;
281 450
282 451 } else {
283 - cpjs_start_error( '<p>'+ cpi18n.unknown_error +' '+ err +'.</p>' );
452 + cpjs_start_error('<p>'+ cpi18n.unknown_error +' '+ err +'.</p>');
284 453 return;
285 454 }
286 455 }
287 456 return;
@@ -312,8 +481,106 @@
312 481 }
313 482 return false;
314 483 }
315 484
485 +// Hide/show the edit box and buttons when renaming a profile.
486 +function cpjs_toggle_name( row ) {
487 + if ( jQuery('#profile_div_'+ row).css('display') == 'none') {
488 + jQuery('#profile_name_'+ row).hide();
489 + jQuery('#profile_div_'+ row).show();
490 + jQuery('#edit-'+ row).val( jQuery('#profile_name_'+ row).html() );
491 + jQuery('#edit-'+ row).focus();
492 + } else {
493 + jQuery('#profile_div_'+ row).hide();
494 + jQuery('#profile_name_'+ row).show();
495 + }
496 +}
497 +
498 +// Edit the profile name via AJAX endpoint.
499 +function cpjs_edit_name( profile, id, cp_nonce, row ) {
500 +
501 + 'use strict';
502 +
503 + if ( cp_nonce == '') {
504 + alert( cpi18n.missing_nonce );
505 + return;
506 + }
507 + if ( profile == '') {
508 + alert( cpi18n.missing_profileid );
509 + return;
510 + }
511 +
512 + var new_name = jQuery('#edit-'+ id).val().trim();
513 + if ( new_name == '') {
514 + alert( cpi18n.missing_profilename );
515 + return;
516 + }
517 +
518 + jQuery('#profile_spinner_'+ row).addClass('is-active');
519 +
520 + var data = {
521 + 'action': 'codeprofiler_rename',
522 + 'cp_nonce': cp_nonce,
523 + 'new_name': new_name,
524 + 'profile': profile,
525 + };
526 +
527 + // Send the request via AJAX
528 + jQuery.ajax( {
529 + type: 'POST',
530 + url: ajaxurl,
531 + data: data,
532 + dataType: 'json',
533 + success: function( response ) {
534 + jQuery('#profile_spinner_'+ row ).removeClass('is-active');
535 +
536 + if (typeof response === 'undefined') {
537 + alert( cpi18n.unknown_error );
538 + return;
539 + }
540 +
541 + if ( response.status != 'success') {
542 + alert( response.message );
543 + return;
544 + }
545 +
546 + // Success: update the name in the table
547 + jQuery('#profile_name_'+ id).html( response.newname );
548 + cpjs_toggle_name(row);
549 + },
550 + // Display non-200 HTTP response
551 + error: function( xhr, status, err ) {
552 + jQuery('#profile_spinner_'+ row ).removeClass('is-active');
553 + if ( err != '') {
554 + if ( xhr.status != 0 ) {
555 + var message = cpi18n.http_error +' '+ xhr.status +' '+ err;
556 + // Timeout
557 + if ( xhr.status == 503 || xhr.status == 504 ) {
558 + alert( message +'<br />'+ cpi18n.timeout_error );
559 + // Redirections, not found
560 + } else if ( xhr.status == 301 || xhr.status == 302 || xhr.status == 404 ) {
561 + alert( message +'<br />'+ cpi18n.notfound_error );
562 + // Forbidden
563 + } else if ( xhr.status == 403 ) {
564 + alert( message +'<br />'+ cpi18n.forbidden_error );
565 + // Internal error
566 + } else if ( xhr.status == 500 ) {
567 + alert( message +'<br />'+ cpi18n.internal_error +'.<br />'+ cpi18n.timeout_error );
568 + } else {
569 + alert( cpi18n.http_error +' '+ xhr.status +' '+ err );
570 + }
571 + return;
572 +
573 + } else {
574 + alert( cpi18n.unknown_error +' '+ err );
575 + return;
576 + }
577 + }
578 + return;
579 + }
580 + });
581 +}
582 +
316 583 // =====================================================================
317 584 // Plugins/Theme chart.
318 585
319 586 function cpjs_plugins_chart( caxis, clabel, cdata, ctotal_time ) {
@@ -320,9 +587,9 @@
320 587 'use strict';
321 588 // Switch between vertical and horizontal bars
322 589 var _indexAxis = caxis;
323 590 document.getElementById('htov').onclick = function() {
324 - if ( _indexAxis == 'x' ) {
591 + if ( _indexAxis == 'x') {
325 592 _indexAxis = 'y';
326 593 } else {
327 594 _indexAxis = 'x';
328 595 }
@@ -331,11 +598,8 @@
331 598 type: 'bar',
332 599 options: {
333 600 animation: {
334 601 duration: 1000,
335 - onComplete: function() {
336 - document.getElementById('download-png-img').href = myChart.toBase64Image();
337 - }
338 602 },
339 603 indexAxis: _indexAxis,
340 604 plugins: chartPlugins
341 605 },
@@ -361,15 +625,15 @@
361 625 const total_time = ctotal_time;
362 626 const footer = (tooltipItems) => {
363 627 var sum;
364 628 tooltipItems.forEach(function(tooltipItem) {
365 - if ( _indexAxis == 'x' ) {
629 + if ( _indexAxis == 'x') {
366 630 sum = Math.round( ( tooltipItem.parsed.y / total_time ) * 100 );
367 631 } else {
368 632 sum = Math.round( ( tooltipItem.parsed.x / total_time ) * 100 );
369 633 }
370 634 });
371 - return '('+ sum + cpi18n.pc_plugins +')';
635 + return sum + cpi18n.pc_plugins;
372 636 };
373 637
374 638 var chartPlugins = {
375 639 title: {
@@ -416,9 +680,8 @@
416 680 animation: {
417 681 duration: 700,
418 682 onComplete: function() {
419 683 jQuery('#cp-footer-buttons').slideDown(200);
420 - document.getElementById('download-png-img').href = myChart.toBase64Image();
421 684 }
422 685 },
423 686 indexAxis: _indexAxis,
424 687 plugins: chartPlugins
@@ -424,8 +687,15 @@
424 687 plugins: chartPlugins
425 688 },
426 689 plugins:[plugin]
427 690 });
691 +
692 + document.getElementById('download-png-img').onclick = function() {
693 + var a = document.createElement('a');
694 + a.href = myChart.toBase64Image();
695 + a.download = jQuery('#download-png-img').attr('download');
696 + a.click();
697 + }
428 698 }
429 699
430 700 // =====================================================================
431 701 // File I/O chart.
@@ -434,9 +704,9 @@
434 704 'use strict';
435 705 // Switch between vertical and horizontal bars
436 706 var _indexAxis = caxis;
437 707 document.getElementById('htov').onclick = function() {
438 - if ( _indexAxis == 'x' ) {
708 + if ( _indexAxis == 'x') {
439 709 _indexAxis = 'y';
440 710 } else {
441 711 _indexAxis = 'x';
442 712 }
@@ -445,11 +715,8 @@
445 715 type: 'line',
446 716 options: {
447 717 animation: {
448 718 duration: 1000,
449 - onComplete: function() {
450 - document.getElementById('download-png-img').href = myChart.toBase64Image();
451 - }
452 719 },
453 720 indexAxis: _indexAxis,
454 721 plugins: chartPlugins
455 722 },
@@ -517,9 +784,8 @@
517 784 animation: {
518 785 duration: 700,
519 786 onComplete: function() {
520 787 jQuery('#cp-footer-buttons').slideDown(200);
521 - document.getElementById('download-png-img').href = myChart.toBase64Image();
522 788 }
523 789 },
524 790 indexAxis: _indexAxis,
525 791 plugins: chartPlugins
@@ -526,8 +792,15 @@
526 792 },
527 793 plugins:[plugin]
528 794 });
529 795
796 + document.getElementById('download-png-img').onclick = function() {
797 + var a = document.createElement('a');
798 + a.href = myChart.toBase64Image();
799 + a.download = jQuery('#download-png-img').attr('download');
800 + a.click();
801 + }
802 +
530 803 }
531 804 // =====================================================================
532 805 // Disk I/O chart.
533 806
@@ -535,9 +808,9 @@
535 808 'use strict';
536 809 // Switch between vertical and horizontal bars
537 810 var _indexAxis = caxis;
538 811 document.getElementById('htov').onclick = function() {
539 - if ( _indexAxis == 'x' ) {
812 + if ( _indexAxis == 'x') {
540 813 _indexAxis = 'y';
541 814 } else {
542 815 _indexAxis = 'x';
543 816 }
@@ -546,11 +819,8 @@
546 819 type: 'line',
547 820 options: {
548 821 animation: {
549 822 duration: 1000,
550 - onComplete: function() {
551 - document.getElementById('download-png-img').href = myChart.toBase64Image();
552 - }
553 823 },
554 824 indexAxis: _indexAxis,
555 825 plugins: chartPlugins
556 826 },
@@ -617,9 +887,8 @@
617 887 animation: {
618 888 duration: 700,
619 889 onComplete: function() {
620 890 jQuery('#cp-footer-buttons').slideDown(200);
621 - document.getElementById('download-png-img').href = myChart.toBase64Image();
622 891 }
623 892 },
624 893 indexAxis: _indexAxis,
625 894 plugins: chartPlugins
@@ -625,8 +894,24 @@
625 894 plugins: chartPlugins
626 895 },
627 896 plugins:[plugin]
628 897 });
898 +
899 + document.getElementById('download-png-img').onclick = function() {
900 + var a = document.createElement('a');
901 + a.href = myChart.toBase64Image();
902 + a.download = jQuery('#download-png-img').attr('download');
903 + a.click();
904 + }
905 +}
906 +
907 +// =====================================================================
908 +// Settings page
909 +
910 +function cpjs_copy_textarea( id ) {
911 + document.getElementById(id).select();
912 + document.execCommand('copy');
913 + alert( cpi18n.text_copied );
629 914 }
630 915
631 916 // =====================================================================
632 917 // EOF