Version 3.18.1
Show:

File: test/js/Reporter.js

            
                /**
                 * An object capable of sending test results to a server.
                 * @param {String} url The URL to submit the results to.
                 * @param {Function} format (Optiona) A function that outputs the results in a specific format.
                 *      Default is YUITest.TestFormat.XML.
                 * @constructor
                 * @namespace Test
                 * @module test
             * @class Reporter
                 */
                YUITest.Reporter = function(url, format) {
            
                    /**
                     * The URL to submit the data to.
                     * @type String
                     * @property url
                     */
                    this.url = url;
            
                    /**
                     * The formatting function to call when submitting the data.
                     * @type Function
                     * @property format
                     */
                    this.format = format || YUITest.TestFormat.XML;
            
                    /**
                     * Extra fields to submit with the request.
                     * @type Object
                     * @property _fields
                     * @private
                     */
                    this._fields = new Object();
            
                    /**
                     * The form element used to submit the results.
                     * @type HTMLFormElement
                     * @property _form
                     * @private
                     */
                    this._form = null;
            
                    /**
                     * Iframe used as a target for form submission.
                     * @type HTMLIFrameElement
                     * @property _iframe
                     * @private
                     */
                    this._iframe = null;
                };
            
                YUITest.Reporter.prototype = {
            
                    //restore missing constructor
                    constructor: YUITest.Reporter,
            
                    /**
                     * Adds a field to the form that submits the results.
                     * @param {String} name The name of the field.
                     * @param {Any} value The value of the field.
                     * @method addField
                     */
                    addField : function (name, value){
                        this._fields[name] = value;
                    },
            
                    /**
                     * Removes all previous defined fields.
                     * @method clearFields
                     */
                    clearFields : function(){
                        this._fields = new Object();
                    },
            
                    /**
                     * Cleans up the memory associated with the TestReporter, removing DOM elements
                     * that were created.
                     * @method destroy
                     */
                    destroy : function() {
                        if (this._form){
                            this._form.parentNode.removeChild(this._form);
                            this._form = null;
                        }
                        if (this._iframe){
                            this._iframe.parentNode.removeChild(this._iframe);
                            this._iframe = null;
                        }
                        this._fields = null;
                    },
            
                    /**
                     * Sends the report to the server.
                     * @param {Object} results The results object created by TestRunner.
                     * @method report
                     */
                    report : function(results){
            
                        //if the form hasn't been created yet, create it
                        if (!this._form){
                            this._form = document.createElement("form");
                            this._form.method = "post";
                            this._form.style.visibility = "hidden";
                            this._form.style.position = "absolute";
                            this._form.style.top = 0;
                            document.body.appendChild(this._form);
            
                            //IE won't let you assign a name using the DOM, must do it the hacky way
                            try {
                                this._iframe = document.createElement("<iframe name=\"yuiTestTarget\" />");
                            } catch (ex){
                                this._iframe = document.createElement("iframe");
                                this._iframe.name = "yuiTestTarget";
                            }
            
                            this._iframe.src = "javascript:false";
                            this._iframe.style.visibility = "hidden";
                            this._iframe.style.position = "absolute";
                            this._iframe.style.top = 0;
                            document.body.appendChild(this._iframe);
            
                            this._form.target = "yuiTestTarget";
                        }
            
                        //set the form's action
                        this._form.action = this.url;
            
                        //remove any existing fields
                        while(this._form.hasChildNodes()){
                            this._form.removeChild(this._form.lastChild);
                        }
            
                        //create default fields
                        this._fields.results = this.format(results);
                        this._fields.useragent = navigator.userAgent;
                        this._fields.timestamp = (new Date()).toLocaleString();
            
                        //add fields to the form
                        for (var prop in this._fields){
                            var value = this._fields[prop];
                            if (this._fields.hasOwnProperty(prop) && (typeof value != "function")){
                                var input = document.createElement("input");
                                input.type = "hidden";
                                input.name = prop;
                                input.value = value;
                                this._form.appendChild(input);
                            }
                        }
            
                        //remove default fields
                        delete this._fields.results;
                        delete this._fields.useragent;
                        delete this._fields.timestamp;
            
                        if (arguments[1] !== false){
                            this._form.submit();
                        }
            
                    }
            
                };