Translated using Weblate (Estonian)
[phpmyadmin.git] / js / error_report.js
blob8843abea23b24933ac5e9ef5ddadb7ef950fca0d
1 /* vim: set expandtab sw=4 ts=4 sts=4: */
2 /**
3  * general function, usually for data manipulation pages
4  *
5  */
7 var ErrorReport = {
8     /**
9      * @var object stores the last exception info
10      */
11     _last_exception: null,
12     /**
13      * handles thrown error exceptions based on user preferences
14      *
15      * @return void
16      */
17     error_handler: function (exception) {
18         if (exception.name === null || typeof(exception.name) === 'undefined') {
19             exception.name = ErrorReport._extractExceptionName(exception);
20         }
21         ErrorReport._last_exception = exception;
22         $.get('error_report.php', {
23             ajax_request: true,
24             server: PMA_commonParams.get('server'),
25             get_settings: true,
26             exception_type: 'js'
27         }, function (data) {
28             if (data.success !== true) {
29                 PMA_ajaxShowMessage(data.error, false);
30                 return;
31             }
32             if (data.report_setting === 'ask') {
33                 ErrorReport._showErrorNotification();
34             } else if (data.report_setting === 'always') {
35                 report_data = ErrorReport._get_report_data(exception);
36                 post_data = $.extend(report_data, {
37                     send_error_report: true,
38                     automatic: true
39                 });
40                 $.post('error_report.php', post_data, function (data) {
41                     if (data.success === false) {
42                         // in the case of an error, show the error message returned.
43                         PMA_ajaxShowMessage(data.error, false);
44                     } else {
45                         PMA_ajaxShowMessage(data.message, false);
46                     }
47                 });
48             }
49         });
50     },
51     /**
52      * Shows the modal dialog previewing the report
53      *
54      * @param exception object error report info
55      *
56      * @return void
57      */
58     _showReportDialog: function (exception) {
59         var report_data = ErrorReport._get_report_data(exception);
61         /* Remove the hidden dialogs if there are*/
62         if ($('#error_report_dialog').length !== 0) {
63             $('#error_report_dialog').remove();
64         }
65         var $div = $('<div id="error_report_dialog"></div>');
66         $div.css('z-index', '1000');
68         var button_options = {};
70         button_options[PMA_messages.strSendErrorReport] = function () {
71             var $dialog = $(this);
72             var post_data = $.extend(report_data, {
73                 send_error_report: true,
74                 description: $('#report_description').val(),
75                 always_send: $('#always_send_checkbox')[0].checked
76             });
77             $.post('error_report.php', post_data, function (data) {
78                 $dialog.dialog('close');
79                 if (data.success === false) {
80                     // in the case of an error, show the error message returned.
81                     PMA_ajaxShowMessage(data.error, false);
82                 } else {
83                     PMA_ajaxShowMessage(data.message, 3000);
84                 }
85             });
86         };
88         button_options[PMA_messages.strCancel] = function () {
89             $(this).dialog('close');
90         };
92         $.post('error_report.php', report_data, function (data) {
93             if (data.success === false) {
94                 // in the case of an error, show the error message returned.
95                 PMA_ajaxShowMessage(data.error, false);
96             } else {
97                 // Show dialog if the request was successful
98                 $div
99                     .append(data.message)
100                     .dialog({
101                         title: PMA_messages.strSubmitErrorReport,
102                         width: 650,
103                         modal: true,
104                         buttons: button_options,
105                         close: function () {
106                             $(this).remove();
107                         }
108                     });
109             }
110         }); // end $.get()
111     },
112     /**
113      * Shows the small notification that asks for user permission
114      *
115      * @return void
116      */
117     _showErrorNotification: function () {
118         ErrorReport._removeErrorNotification();
120         var $div = $(
121             '<div style="position:fixed;bottom:0;left:0;right:0;margin:0;' +
122             'z-index:1000" class="error" id="error_notification"></div>'
123         ).append(
124             PMA_getImage('s_error') + PMA_messages.strErrorOccurred
125         );
127         var $buttons = $('<div class="floatright"></div>');
129         var button_html  = '<button id="show_error_report">';
130         button_html += PMA_messages.strShowReportDetails;
131         button_html += '</button>';
133         button_html += '<a id="change_error_settings">';
134         button_html += PMA_getImage('s_cog', PMA_messages.strChangeReportSettings);
135         button_html += '</a>';
137         button_html += '<a href="#" id="ignore_error">';
138         button_html += PMA_getImage('b_close', PMA_messages.strIgnore);
139         button_html += '</a>';
141         $buttons.html(button_html);
143         $div.append($buttons);
144         $div.appendTo(document.body);
145         $('#change_error_settings').on('click', ErrorReport._redirect_to_settings);
146         $('#show_error_report').on('click', ErrorReport._createReportDialog);
147         $('#ignore_error').on('click', ErrorReport._removeErrorNotification);
148     },
149     /**
150      * Removes the notification if it was displayed before
151      *
152      * @return void
153      */
154     _removeErrorNotification: function (e) {
155         if (e) {
156             // don't remove the hash fragment by navigating to #
157             e.preventDefault();
158         }
159         $('#error_notification').fadeOut(function () {
160             $(this).remove();
161         });
162     },
163     /**
164      * Extracts Exception name from message if it exists
165      *
166      * @return String
167      */
168     _extractExceptionName: function (exception) {
169         if (exception.message === null || typeof(exception.message) === 'undefined') {
170             return '';
171         }
173         var reg = /([a-zA-Z]+):/;
174         var regex_result = reg.exec(exception.message);
175         if (regex_result && regex_result.length === 2) {
176             return regex_result[1];
177         }
179         return '';
180     },
181     /**
182      * Shows the modal dialog previewing the report
183      *
184      * @return void
185      */
186     _createReportDialog: function () {
187         ErrorReport._removeErrorNotification();
188         ErrorReport._showReportDialog(ErrorReport._last_exception);
189     },
190     /**
191      * Redirects to the settings page containing error report
192      * preferences
193      *
194      * @return void
195      */
196     _redirect_to_settings: function () {
197         window.location.href = 'prefs_forms.php';
198     },
199     /**
200      * Returns the report data to send to the server
201      *
202      * @param exception object exception info
203      *
204      * @return object
205      */
206     _get_report_data: function (exception) {
207         var report_data = {
208             'ajax_request': true,
209             'exception': exception,
210             'current_url': window.location.href,
211             'exception_type': 'js'
212         };
213         if (AJAX.scriptHandler._scripts.length > 0) {
214             report_data.scripts = AJAX.scriptHandler._scripts.map(
215                 function (script) {
216                     return script.name;
217                 }
218             );
219         }
220         return report_data;
221     },
222     /**
223      * Wraps all global functions that start with PMA_
224      *
225      * @return void
226      */
227     wrap_global_functions: function () {
228         for (var key in window) {
229             if (key.indexOf('PMA_') === 0) {
230                 var global = window[key];
231                 if (typeof(global) === 'function') {
232                     window[key] = ErrorReport.wrap_function(global);
233                 }
234             }
235         }
236     },
237     /**
238      * Wraps given function in error reporting code and returns wrapped function
239      *
240      * @param func function to be wrapped
241      *
242      * @return function
243      */
244     wrap_function: function (func) {
245         if (!func.wrapped) {
246             var new_func = function () {
247                 try {
248                     return func.apply(this, arguments);
249                 } catch (x) {
250                     TraceKit.report(x);
251                 }
252             };
253             new_func.wrapped = true;
254             // Set guid of wrapped function same as original function, so it can be removed
255             // See bug#4146 (problem with jquery draggable and sortable)
256             new_func.guid = func.guid = func.guid || new_func.guid || jQuery.guid++;
257             return new_func;
258         } else {
259             return func;
260         }
261     },
262     /**
263      * Automatically wraps the callback in AJAX.registerOnload
264      *
265      * @return void
266      */
267     _wrap_ajax_onload_callback: function () {
268         var oldOnload = AJAX.registerOnload;
269         AJAX.registerOnload = function (file, func) {
270             func = ErrorReport.wrap_function(func);
271             oldOnload.call(this, file, func);
272         };
273     },
274     /**
275      * Automatically wraps the callback in $.fn.on
276      *
277      * @return void
278      */
279     _wrap_$_on_callback: function () {
280         var oldOn = $.fn.on;
281         $.fn.on = function () {
282             for (var i = 1; i <= 3; i++) {
283                 if (typeof(arguments[i]) === 'function') {
284                     arguments[i] = ErrorReport.wrap_function(arguments[i]);
285                     break;
286                 }
287             }
288             return oldOn.apply(this, arguments);
289         };
290     },
291     /**
292      * Wraps all global functions that start with PMA_
293      * also automatically wraps the callback in AJAX.registerOnload
294      *
295      * @return void
296      */
297     set_up_error_reporting: function () {
298         ErrorReport.wrap_global_functions();
299         ErrorReport._wrap_ajax_onload_callback();
300         ErrorReport._wrap_$_on_callback();
301     }
305 AJAX.registerOnload('error_report.js', function () {
306     TraceKit.report.subscribe(ErrorReport.error_handler);
307     ErrorReport.set_up_error_reporting();
308     ErrorReport.wrap_global_functions();