@@ -50,19 +50,23 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') {
50
50
var request = function (url , onSuccess , onError , payload , options , tries ) {
51
51
var xhr = window .XMLHttpRequest ? new XMLHttpRequest () : new ActiveXObject (' Microsoft.XMLHTTP' );
52
52
options = options || {};
53
- options .maxTries = options .maxTries || 0 ;
53
+ options .retry = options .retry || false ;
54
54
tries = tries || 1 ;
55
- var delay = Math .pow (2 , tries - 1 ) * 1000 ;
55
+ /* this delays for 125, 375, 625, 875, and 1000, ... */
56
+ var delay = tries < 5 ? (tries - 0.5 ) * 250 : 1000 ;
57
+
56
58
xhr .open (options .method || ' GET' , url, true );
57
59
xhr .setRequestHeader (' X-Requested-With' , ' XMLHttpRequest' );
58
60
xhr .onreadystatechange = function (state ) {
59
61
if (4 !== xhr .readyState ) {
60
62
return null ;
61
63
}
62
64
63
- if (xhr .status == 404 && options .maxTries > 1 ) {
64
- setTimeout (function (){
65
- options .maxTries -- ;
65
+ if (xhr .status == 404 && options .retry && ! options .stop ) {
66
+ setTimeout (function () {
67
+ if (options .stop ) {
68
+ return ;
69
+ }
66
70
request (url, onSuccess, onError, payload, options, tries + 1 );
67
71
}, delay);
68
72
@@ -75,6 +79,11 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') {
75
79
(onError || noop)(xhr);
76
80
}
77
81
};
82
+
83
+ if (options .onSend ) {
84
+ options .onSend (tries);
85
+ }
86
+
78
87
xhr .send (payload || ' ' );
79
88
};
80
89
@@ -430,8 +439,94 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') {
430
439
return this ;
431
440
},
432
441
442
+ showToolbar : function (token ) {
443
+ var sfwdt = document .getElementById (' sfwdt' + token);
444
+ removeClass (sfwdt, ' sf-display-none' );
445
+
446
+ if (getPreference (' toolbar/displayState' ) == ' none' ) {
447
+ document .getElementById (' sfToolbarMainContent-' + token).style .display = ' none' ;
448
+ document .getElementById (' sfToolbarClearer-' + token).style .display = ' none' ;
449
+ document .getElementById (' sfMiniToolbar-' + token).style .display = ' block' ;
450
+ } else {
451
+ document .getElementById (' sfToolbarMainContent-' + token).style .display = ' block' ;
452
+ document .getElementById (' sfToolbarClearer-' + token).style .display = ' block' ;
453
+ document .getElementById (' sfMiniToolbar-' + token).style .display = ' none' ;
454
+ }
455
+ },
456
+
457
+ hideToolbar : function (token ) {
458
+ var sfwdt = document .getElementById (' sfwdt' + token);
459
+ addClass (sfwdt, ' sf-display-none' );
460
+ },
461
+
462
+ initToolbar : function (token ) {
463
+ this .showToolbar (token);
464
+
465
+ var hideButton = document .getElementById (' sfToolbarHideButton-' + token);
466
+ var hideButtonSvg = hideButton .querySelector (' svg' );
467
+ hideButtonSvg .setAttribute (' aria-hidden' , ' true' );
468
+ hideButtonSvg .setAttribute (' focusable' , ' false' );
469
+ addEventListener (hideButton, ' click' , function (event ) {
470
+ event .preventDefault ();
471
+
472
+ var p = this .parentNode ;
473
+ p .style .display = ' none' ;
474
+ (p .previousElementSibling || p .previousSibling ).style .display = ' none' ;
475
+ document .getElementById (' sfMiniToolbar-' + token).style .display = ' block' ;
476
+ setPreference (' toolbar/displayState' , ' none' );
477
+ });
478
+
479
+ var showButton = document .getElementById (' sfToolbarMiniToggler-' + token);
480
+ var showButtonSvg = showButton .querySelector (' svg' );
481
+ showButtonSvg .setAttribute (' aria-hidden' , ' true' );
482
+ showButtonSvg .setAttribute (' focusable' , ' false' );
483
+ addEventListener (showButton, ' click' , function (event ) {
484
+ event .preventDefault ();
485
+
486
+ var elem = this .parentNode ;
487
+ if (elem .style .display == ' none' ) {
488
+ document .getElementById (' sfToolbarMainContent-' + token).style .display = ' none' ;
489
+ document .getElementById (' sfToolbarClearer-' + token).style .display = ' none' ;
490
+ elem .style .display = ' block' ;
491
+ } else {
492
+ document .getElementById (' sfToolbarMainContent-' + token).style .display = ' block' ;
493
+ document .getElementById (' sfToolbarClearer-' + token).style .display = ' block' ;
494
+ elem .style .display = ' none'
495
+ }
496
+
497
+ setPreference (' toolbar/displayState' , ' block' );
498
+ });
499
+ },
500
+
433
501
loadToolbar : function (token , newToken ) {
502
+ var that = this ;
503
+ var triesCounter = document .getElementById (' sfLoadCounter-' + token);
504
+
505
+ var options = {
506
+ retry: true ,
507
+ onSend : function (count ) {
508
+ if (count === 3 ) {
509
+ that .initToolbar (token);
510
+ }
511
+
512
+ if (triesCounter) {
513
+ triesCounter .textContent = count;
514
+ }
515
+ },
516
+ };
517
+
518
+ var cancelButton = document .getElementById (' sfLoadCancel-' + token);
519
+ if (cancelButton) {
520
+ addEventListener (cancelButton, ' click' , function (event ) {
521
+ event .preventDefault ();
522
+
523
+ options .stop = true ;
524
+ that .hideToolbar (token);
525
+ });
526
+ }
527
+
434
528
newToken = (newToken || token);
529
+
435
530
this .load (
436
531
' sfwdt' + token,
437
532
' {{ url("_wdt", { "token": "xxxxxx" })|escape(' js' ) }}' .replace (/ xxxxxx/ , newToken),
@@ -453,15 +548,7 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') {
453
548
return ;
454
549
}
455
550
456
- if (getPreference (' toolbar/displayState' ) == ' none' ) {
457
- document .getElementById (' sfToolbarMainContent-' + newToken).style .display = ' none' ;
458
- document .getElementById (' sfToolbarClearer-' + newToken).style .display = ' none' ;
459
- document .getElementById (' sfMiniToolbar-' + newToken).style .display = ' block' ;
460
- } else {
461
- document .getElementById (' sfToolbarMainContent-' + newToken).style .display = ' block' ;
462
- document .getElementById (' sfToolbarClearer-' + newToken).style .display = ' block' ;
463
- document .getElementById (' sfMiniToolbar-' + newToken).style .display = ' none' ;
464
- }
551
+ that .initToolbar (newToken);
465
552
466
553
/* Handle toolbar-info position */
467
554
var toolbarBlocks = [].slice .call (el .querySelectorAll (' .sf-toolbar-block' ));
@@ -489,39 +576,7 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') {
489
576
}
490
577
};
491
578
}
492
- var hideButton = document .getElementById (' sfToolbarHideButton-' + newToken);
493
- var hideButtonSvg = hideButton .querySelector (' svg' );
494
- hideButtonSvg .setAttribute (' aria-hidden' , ' true' );
495
- hideButtonSvg .setAttribute (' focusable' , ' false' );
496
- addEventListener (hideButton, ' click' , function (event ) {
497
- event .preventDefault ();
498
-
499
- var p = this .parentNode ;
500
- p .style .display = ' none' ;
501
- (p .previousElementSibling || p .previousSibling ).style .display = ' none' ;
502
- document .getElementById (' sfMiniToolbar-' + newToken).style .display = ' block' ;
503
- setPreference (' toolbar/displayState' , ' none' );
504
- });
505
- var showButton = document .getElementById (' sfToolbarMiniToggler-' + newToken);
506
- var showButtonSvg = showButton .querySelector (' svg' );
507
- showButtonSvg .setAttribute (' aria-hidden' , ' true' );
508
- showButtonSvg .setAttribute (' focusable' , ' false' );
509
- addEventListener (showButton, ' click' , function (event ) {
510
- event .preventDefault ();
511
579
512
- var elem = this .parentNode ;
513
- if (elem .style .display == ' none' ) {
514
- document .getElementById (' sfToolbarMainContent-' + newToken).style .display = ' none' ;
515
- document .getElementById (' sfToolbarClearer-' + newToken).style .display = ' none' ;
516
- elem .style .display = ' block' ;
517
- } else {
518
- document .getElementById (' sfToolbarMainContent-' + newToken).style .display = ' block' ;
519
- document .getElementById (' sfToolbarClearer-' + newToken).style .display = ' block' ;
520
- elem .style .display = ' none'
521
- }
522
-
523
- setPreference (' toolbar/displayState' , ' block' );
524
- });
525
580
renderAjaxRequests ();
526
581
addEventListener (document .querySelector (' .sf-toolbar-ajax-clear' ), ' click' , function () {
527
582
requestStack = [];
@@ -550,7 +605,7 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') {
550
605
}
551
606
},
552
607
function (xhr ) {
553
- if (xhr .status !== 0 ) {
608
+ if (xhr .status !== 0 && ! options . stop ) {
554
609
var sfwdt = document .getElementById (' sfwdt' + token);
555
610
sfwdt .innerHTML = ' \
556
611
<div class="sf-toolbarreset">\
@@ -561,7 +616,7 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') {
561
616
sfwdt .setAttribute (' class' , ' sf-toolbar sf-error-toolbar' );
562
617
}
563
618
},
564
- { maxTries : 5 }
619
+ options
565
620
);
566
621
567
622
return this ;
0 commit comments