Unreviewed, rolling out r216677.
[WebKit-https.git] / PerformanceTests / Speedometer / resources / todomvc / dependency-examples / flight / flight / node_modules / flight / lib / debug.js
1 /* Copyright 2013 Twitter, Inc. Licensed under The MIT License. http://opensource.org/licenses/MIT */
2
3 define(
4
5   ['./registry'],
6
7   function(registry) {
8     'use strict';
9
10     // ==========================================
11     // Search object model
12     // ==========================================
13
14     function traverse(util, searchTerm, options) {
15       options = options || {};
16       var obj = options.obj || window;
17       var path = options.path || ((obj == window) ? 'window' : '');
18       var props = Object.keys(obj);
19       props.forEach(function(prop) {
20         if ((tests[util] || util)(searchTerm, obj, prop)) {
21           console.log([path, '.', prop].join(''), '->', ['(', typeof obj[prop], ')'].join(''), obj[prop]);
22         }
23         if (Object.prototype.toString.call(obj[prop]) == '[object Object]' && (obj[prop] != obj) && path.split('.').indexOf(prop) == -1) {
24           traverse(util, searchTerm, {obj: obj[prop], path: [path,prop].join('.')});
25         }
26       });
27     }
28
29     function search(util, expected, searchTerm, options) {
30       if (!expected || typeof searchTerm == expected) {
31         traverse(util, searchTerm, options);
32       } else {
33         console.error([searchTerm, 'must be', expected].join(' '));
34       }
35     }
36
37     var tests = {
38       'name': function(searchTerm, obj, prop) {return searchTerm == prop;},
39       'nameContains': function(searchTerm, obj, prop) {return prop.indexOf(searchTerm) > -1;},
40       'type': function(searchTerm, obj, prop) {return obj[prop] instanceof searchTerm;},
41       'value': function(searchTerm, obj, prop) {return obj[prop] === searchTerm;},
42       'valueCoerced': function(searchTerm, obj, prop) {return obj[prop] == searchTerm;}
43     };
44
45     function byName(searchTerm, options) {search('name', 'string', searchTerm, options);}
46     function byNameContains(searchTerm, options) {search('nameContains', 'string', searchTerm, options);}
47     function byType(searchTerm, options) {search('type', 'function', searchTerm, options);}
48     function byValue(searchTerm, options) {search('value', null, searchTerm, options);}
49     function byValueCoerced(searchTerm, options) {search('valueCoerced', null, searchTerm, options);}
50     function custom(fn, options) {traverse(fn, null, options);}
51
52     // ==========================================
53     // Event logging
54     // ==========================================
55
56     var ALL = 'all'; //no filter
57
58     //log nothing by default
59     var logFilter = {
60       eventNames: [],
61       actions: []
62     }
63
64     function filterEventLogsByAction(/*actions*/) {
65       var actions = [].slice.call(arguments);
66
67       logFilter.eventNames.length || (logFilter.eventNames = ALL);
68       logFilter.actions = actions.length ? actions : ALL;
69       saveLogFilter();
70     }
71
72     function filterEventLogsByName(/*eventNames*/) {
73       var eventNames = [].slice.call(arguments);
74
75       logFilter.actions.length || (logFilter.actions = ALL);
76       logFilter.eventNames = eventNames.length ? eventNames : ALL;
77       saveLogFilter();
78     }
79
80     function hideAllEventLogs() {
81       logFilter.actions = [];
82       logFilter.eventNames = [];
83       saveLogFilter();
84     }
85
86     function showAllEventLogs() {
87       logFilter.actions = ALL;
88       logFilter.eventNames = ALL;
89       saveLogFilter();
90     }
91
92     function saveLogFilter() {
93       try {
94         if (window.localStorage) {
95           localStorage.setItem('logFilter_eventNames', logFilter.eventNames);
96           localStorage.setItem('logFilter_actions', logFilter.actions);
97         }
98       } catch (ignored) {};
99     }
100
101     function retrieveLogFilter() {
102       var eventNames, actions;
103       try {
104         eventNames = (window.localStorage && localStorage.getItem('logFilter_eventNames'));
105         actions = (window.localStorage && localStorage.getItem('logFilter_actions'));
106       } catch (ignored) {
107         return;
108       }
109       eventNames && (logFilter.eventNames = eventNames);
110       actions && (logFilter.actions = actions);
111
112       // reconstitute arrays in place
113       Object.keys(logFilter).forEach(function(k) {
114         var thisProp = logFilter[k];
115         if (typeof thisProp == 'string' && thisProp !== ALL) {
116           logFilter[k] = thisProp ? thisProp.split(',') : [];
117         }
118       });
119     }
120
121     return {
122
123       enable: function(enable) {
124         this.enabled = !!enable;
125
126         if (enable && window.console) {
127           console.info('Booting in DEBUG mode');
128           console.info('You can configure event logging with DEBUG.events.logAll()/logNone()/logByName()/logByAction()');
129         }
130
131         retrieveLogFilter();
132
133         window.DEBUG = this;
134       },
135
136       registry: registry,
137
138       find: {
139         byName: byName,
140         byNameContains: byNameContains,
141         byType: byType,
142         byValue: byValue,
143         byValueCoerced: byValueCoerced,
144         custom: custom
145       },
146
147       events: {
148         logFilter: logFilter,
149
150         // Accepts any number of action args
151         // e.g. DEBUG.events.logByAction("on", "off")
152         logByAction: filterEventLogsByAction,
153
154         // Accepts any number of event name args (inc. regex or wildcards)
155         // e.g. DEBUG.events.logByName(/ui.*/, "*Thread*");
156         logByName: filterEventLogsByName,
157
158         logAll: showAllEventLogs,
159         logNone: hideAllEventLogs
160       }
161     };
162   }
163 );