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