]> git.wh0rd.org - tt-rss.git/blame - lib/dojo/promise/instrumentation.js.uncompressed.js
upgrade dojo to 1.8.3 (refs #570)
[tt-rss.git] / lib / dojo / promise / instrumentation.js.uncompressed.js
CommitLineData
f0cfe83e
AD
1define("dojo/promise/instrumentation", [
2 "./tracer",
3 "../has",
4 "../_base/lang",
5 "../_base/array"
6], function(tracer, has, lang, arrayUtil){
7 function logError(error, rejection, deferred){
8 var stack = "";
9 if(error && error.stack){
10 stack += error.stack;
11 }
12 if(rejection && rejection.stack){
13 stack += "\n ----------------------------------------\n rejected" + rejection.stack.split("\n").slice(1).join("\n").replace(/^\s+/, " ");
14 }
15 if(deferred && deferred.stack){
16 stack += "\n ----------------------------------------\n" + deferred.stack;
17 }
18 console.error(error, stack);
19 }
20
21 function reportRejections(error, handled, rejection, deferred){
22 if(!handled){
23 logError(error, rejection, deferred);
24 }
25 }
26
27 var errors = [];
28 var activeTimeout = false;
29 var unhandledWait = 1000;
30 function trackUnhandledRejections(error, handled, rejection, deferred){
31 if(handled){
32 arrayUtil.some(errors, function(obj, ix){
33 if(obj.error === error){
34 errors.splice(ix, 1);
35 return true;
36 }
37 });
38 }else if(!arrayUtil.some(errors, function(obj){ return obj.error === error; })){
39 errors.push({
40 error: error,
41 rejection: rejection,
42 deferred: deferred,
43 timestamp: new Date().getTime()
44 });
45 }
46
47 if(!activeTimeout){
48 activeTimeout = setTimeout(logRejected, unhandledWait);
49 }
50 }
51
52 function logRejected(){
53 var now = new Date().getTime();
54 var reportBefore = now - unhandledWait;
55 errors = arrayUtil.filter(errors, function(obj){
56 if(obj.timestamp < reportBefore){
57 logError(obj.error, obj.rejection, obj.deferred);
58 return false;
59 }
60 return true;
61 });
62
63 if(errors.length){
64 activeTimeout = setTimeout(logRejected, errors[0].timestamp + unhandledWait - now);
65 }else{
66 activeTimeout = false;
67 }
68 }
69
70 return function(Deferred){
71 // summary:
72 // Initialize instrumentation for the Deferred class.
73 // description:
74 // Initialize instrumentation for the Deferred class.
75 // Done automatically by `dojo/Deferred` if the
76 // `deferredInstrumentation` and `useDeferredInstrumentation`
77 // config options are set.
78 //
79 // Sets up `dojo/promise/tracer` to log to the console.
80 //
81 // Sets up instrumentation of rejected deferreds so unhandled
82 // errors are logged to the console.
83
84 var usage = has("config-useDeferredInstrumentation");
85 if(usage){
86 tracer.on("resolved", lang.hitch(console, "log", "resolved"));
87 tracer.on("rejected", lang.hitch(console, "log", "rejected"));
88 tracer.on("progress", lang.hitch(console, "log", "progress"));
89
90 var args = [];
91 if(typeof usage === "string"){
92 args = usage.split(",");
93 usage = args.shift();
94 }
95 if(usage === "report-rejections"){
96 Deferred.instrumentRejected = reportRejections;
97 }else if(usage === "report-unhandled-rejections" || usage === true || usage === 1){
98 Deferred.instrumentRejected = trackUnhandledRejections;
99 unhandledWait = parseInt(args[0], 10) || unhandledWait;
100 }else{
101 throw new Error("Unsupported instrumentation usage <" + usage + ">");
102 }
103 }
104 };
105});