123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- /* vim: set expandtab sw=4 ts=4 sts=4: */
- /**
- * general function, usually for data manipulation pages
- *
- */
- var ErrorReport = {
- /**
- * @var object stores the last exception info
- */
- _last_exception: null,
- /**
- * handles thrown error exceptions based on user preferences
- *
- * @return void
- */
- error_handler: function (exception) {
- // issue: 14359
- if (JSON.stringify(ErrorReport._last_exception) === JSON.stringify(exception)) {
- return;
- }
- if (exception.name === null || typeof(exception.name) === 'undefined') {
- exception.name = ErrorReport._extractExceptionName(exception);
- }
- ErrorReport._last_exception = exception;
- $.post('error_report.php', {
- ajax_request: true,
- server: PMA_commonParams.get('server'),
- get_settings: true,
- exception_type: 'js'
- }, function (data) {
- if (data.success !== true) {
- PMA_ajaxShowMessage(data.error, false);
- return;
- }
- if (data.report_setting === 'ask') {
- ErrorReport._showErrorNotification();
- } else if (data.report_setting === 'always') {
- report_data = ErrorReport._get_report_data(exception);
- post_data = $.extend(report_data, {
- send_error_report: true,
- automatic: true
- });
- $.post('error_report.php', post_data, function (data) {
- if (data.success === false) {
- // in the case of an error, show the error message returned.
- PMA_ajaxShowMessage(data.error, false);
- } else {
- PMA_ajaxShowMessage(data.message, false);
- }
- });
- }
- });
- },
- /**
- * Shows the modal dialog previewing the report
- *
- * @param exception object error report info
- *
- * @return void
- */
- _showReportDialog: function (exception) {
- var report_data = ErrorReport._get_report_data(exception);
- /* Remove the hidden dialogs if there are*/
- if ($('#error_report_dialog').length !== 0) {
- $('#error_report_dialog').remove();
- }
- var $div = $('<div id="error_report_dialog"></div>');
- $div.css('z-index', '1000');
- var button_options = {};
- button_options[PMA_messages.strSendErrorReport] = function () {
- var $dialog = $(this);
- var post_data = $.extend(report_data, {
- send_error_report: true,
- description: $('#report_description').val(),
- always_send: $('#always_send_checkbox')[0].checked
- });
- $.post('error_report.php', post_data, function (data) {
- $dialog.dialog('close');
- if (data.success === false) {
- // in the case of an error, show the error message returned.
- PMA_ajaxShowMessage(data.error, false);
- } else {
- PMA_ajaxShowMessage(data.message, 3000);
- }
- });
- };
- button_options[PMA_messages.strCancel] = function () {
- $(this).dialog('close');
- };
- $.post('error_report.php', report_data, function (data) {
- if (data.success === false) {
- // in the case of an error, show the error message returned.
- PMA_ajaxShowMessage(data.error, false);
- } else {
- // Show dialog if the request was successful
- $div
- .append(data.message)
- .dialog({
- title: PMA_messages.strSubmitErrorReport,
- width: 650,
- modal: true,
- buttons: button_options,
- close: function () {
- $(this).remove();
- }
- });
- }
- });
- },
- /**
- * Shows the small notification that asks for user permission
- *
- * @return void
- */
- _showErrorNotification: function () {
- ErrorReport._removeErrorNotification();
- var $div = $(
- '<div style="position:fixed;bottom:0;left:0;right:0;margin:0;' +
- 'z-index:1000" class="error" id="error_notification"></div>'
- ).append(
- PMA_getImage('s_error') + PMA_messages.strErrorOccurred
- );
- var $buttons = $('<div class="floatright"></div>');
- var button_html = '<button id="show_error_report">';
- button_html += PMA_messages.strShowReportDetails;
- button_html += '</button>';
- button_html += '<a id="change_error_settings">';
- button_html += PMA_getImage('s_cog', PMA_messages.strChangeReportSettings);
- button_html += '</a>';
- button_html += '<a href="#" id="ignore_error">';
- button_html += PMA_getImage('b_close', PMA_messages.strIgnore);
- button_html += '</a>';
- $buttons.html(button_html);
- $div.append($buttons);
- $div.appendTo(document.body);
- $(document).on('click', '#change_error_settings', ErrorReport._redirect_to_settings);
- $(document).on('click', '#show_error_report', ErrorReport._createReportDialog);
- $(document).on('click', '#ignore_error', ErrorReport._removeErrorNotification);
- },
- /**
- * Removes the notification if it was displayed before
- *
- * @return void
- */
- _removeErrorNotification: function (e) {
- if (e) {
- // don't remove the hash fragment by navigating to #
- e.preventDefault();
- }
- $('#error_notification').fadeOut(function () {
- $(this).remove();
- });
- },
- /**
- * Extracts Exception name from message if it exists
- *
- * @return String
- */
- _extractExceptionName: function (exception) {
- if (exception.message === null || typeof(exception.message) === 'undefined') {
- return '';
- }
- var reg = /([a-zA-Z]+):/;
- var regex_result = reg.exec(exception.message);
- if (regex_result && regex_result.length === 2) {
- return regex_result[1];
- }
- return '';
- },
- /**
- * Shows the modal dialog previewing the report
- *
- * @return void
- */
- _createReportDialog: function () {
- ErrorReport._removeErrorNotification();
- ErrorReport._showReportDialog(ErrorReport._last_exception);
- },
- /**
- * Redirects to the settings page containing error report
- * preferences
- *
- * @return void
- */
- _redirect_to_settings: function () {
- window.location.href = 'prefs_forms.php';
- },
- /**
- * Returns the report data to send to the server
- *
- * @param exception object exception info
- *
- * @return object
- */
- _get_report_data: function (exception) {
- if (exception && exception.stack && exception.stack.length) {
- for (var i = 0; i < exception.stack.length; i++) {
- var stack = exception.stack[i];
- if (stack.context && stack.context.length) {
- for (var j = 0; j < stack.context.length; j++) {
- if (stack.context[j].length > 80) {
- stack.context[j] = stack.context[j].substring(-1, 75) + '//...';
- }
- }
- }
- }
- }
- var report_data = {
- 'server': PMA_commonParams.get('server'),
- 'ajax_request': true,
- 'exception': exception,
- 'url': window.location.href,
- 'exception_type': 'js'
- };
- if (AJAX.scriptHandler._scripts.length > 0) {
- report_data.scripts = AJAX.scriptHandler._scripts.map(
- function (script) {
- return script;
- }
- );
- }
- return report_data;
- },
- /**
- * Wraps all global functions that start with PMA_
- *
- * @return void
- */
- wrap_global_functions: function () {
- for (var key in window) {
- if (key.indexOf('PMA_') === 0) {
- var global = window[key];
- if (typeof(global) === 'function') {
- window[key] = ErrorReport.wrap_function(global);
- }
- }
- }
- },
- /**
- * Wraps given function in error reporting code and returns wrapped function
- *
- * @param func function to be wrapped
- *
- * @return function
- */
- wrap_function: function (func) {
- if (!func.wrapped) {
- var new_func = function () {
- try {
- return func.apply(this, arguments);
- } catch (x) {
- TraceKit.report(x);
- }
- };
- new_func.wrapped = true;
- // Set guid of wrapped function same as original function, so it can be removed
- // See bug#4146 (problem with jquery draggable and sortable)
- new_func.guid = func.guid = func.guid || new_func.guid || jQuery.guid++;
- return new_func;
- } else {
- return func;
- }
- },
- /**
- * Automatically wraps the callback in AJAX.registerOnload
- *
- * @return void
- */
- _wrap_ajax_onload_callback: function () {
- var oldOnload = AJAX.registerOnload;
- AJAX.registerOnload = function (file, func) {
- func = ErrorReport.wrap_function(func);
- oldOnload.call(this, file, func);
- };
- },
- /**
- * Automatically wraps the callback in $.fn.on
- *
- * @return void
- */
- _wrap_$_on_callback: function () {
- var oldOn = $.fn.on;
- $.fn.on = function () {
- for (var i = 1; i <= 3; i++) {
- if (typeof(arguments[i]) === 'function') {
- arguments[i] = ErrorReport.wrap_function(arguments[i]);
- break;
- }
- }
- return oldOn.apply(this, arguments);
- };
- },
- /**
- * Wraps all global functions that start with PMA_
- * also automatically wraps the callback in AJAX.registerOnload
- *
- * @return void
- */
- set_up_error_reporting: function () {
- ErrorReport.wrap_global_functions();
- ErrorReport._wrap_ajax_onload_callback();
- ErrorReport._wrap_$_on_callback();
- }
- };
- AJAX.registerOnload('error_report.js', function () {
- TraceKit.report.subscribe(ErrorReport.error_handler);
- ErrorReport.set_up_error_reporting();
- ErrorReport.wrap_global_functions();
- });
|