/* Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ /** * @fileOverview Defines the {@link CKEDITOR.test} object, which contains * functions used at our testing environment. */ /*jsl:import ../tests/yuitest.js*/ /** * Contains functions used at our testing environment. Currently, * our testing system is based on the * YUI Test. * @namespace * @example */ CKEDITOR.test = { /** * The assertion namespace, containing all assertion functions. Currently, * this is an alias for * YAHOO.util.Assert. * @example * CKEDITOR.test.assert.areEqual( '10', 10 ); // "true" * CKEDITOR.test.assert.areSame( '10', 10 ); // "false" * CKEDITOR.test.assert.isUndefined( window.test ); // "true" */ assert : YAHOO.util.Assert, runner : YAHOO.tool.TestRunner, /** * Adds a test case to the test runner. * @param {Object} testCase The test case object. See other tests for * examples. * @example * CKEDITOR.test.addTestCase((function() * { * // Local reference to the "assert" object. * var assert = CKEDITOR.test.assert; * * return { * test_example : function() * { * assert.areSame( '10', 10 ); // FAIL * } * }; * })()); */ addTestCase : function( testCase ) { YAHOO.tool.TestRunner.add( new YAHOO.tool.TestCase( testCase ) ); }, /** * Gets the inner HTML of an element, for testing purposes. * @param {Boolean} stripLineBreaks Assign 'false' to avoid trimming line-breaks. */ getInnerHtml : function( elementOrId , stripLineBreaks ) { var html; if ( typeof elementOrId == 'string' ) html = document.getElementById( elementOrId ).innerHTML; else if ( elementOrId.getHtml ) html = elementOrId.getHtml(); else html = elementOrId.innerHTML // retrieve from innerHTML || elementOrId.value; // retrieve from value return CKEDITOR.test.fixHtml( html, stripLineBreaks ); }, fixHtml : function( html, stripLineBreaks ) { html = html.toLowerCase(); if ( stripLineBreaks !== false ) html = html.replace( /[\n\r]/g, '' ); else html = html.replace( /\r/g, '' ); // Normalize CRLF. function sorter( a, b ) { var nameA = a[ 0 ]; var nameB = b[ 0 ]; return nameA < nameB ? -1 : nameA > nameB ? 1 : 0; } html = html.replace( /<\w[^>]*/g, function( match ) { var attribs = []; var hasClass; match = match.replace( /\s([^\s=]+)=((?:"[^"]*")|(?:'[^']*')|(?:[^\s]+))/g, function( match, attName, attValue ) { if ( attName == 'style' ) { // Reorganize the style rules so they are sorted by name. var rules = []; // Push all rules into an Array. attValue.replace( /(?:"| |;|^ )\s*([^ :]+?)\s*:\s*([^;"]+?)\s*(?=;|"|$)/g, function( match, name, value ) { rules.push( [ name, value ] ); }); // Sort the Array. rules.sort( sorter ); // Transform each rule entry into a string name:value. for ( var i = 0 ; i < rules.length ; i++ ) rules[ i ] = rules[ i ].join( ':' ); // Join all rules with commas, removing spaces and adding an extra comma to the end. attValue = '"' + rules && ( rules.join( ';' ).replace( /\s+/g, '' ) + ';' ); } // IE may have 'class' more than once. if ( attName == 'class' ) { if ( hasClass ) return ''; hasClass = true; } if ( attName != '_cke_expando' ) attribs.push( [ attName, attValue ] ); return ''; } ); attribs.sort( sorter ); var ret = match.replace( /\s{2,}/g, ' ' ); for ( var i = 0 ; i < attribs.length ; i++ ) { ret += ' ' + attribs[i][0] + '='; ret += (/^["']/).test( attribs[i][1] ) ? attribs[i][1] : '"' + attribs[i][1] + '"'; } return ret; } ); return html; }, /** * Wrapper of CKEDITOR.dom.element::getAttribute for style text normalization. * @param element * @param attrName */ getAttribute : function( element, attrName ) { var retval = element.getAttribute( attrName ); if ( attrName == 'style' ) { // 1. Lower case property name. // 2. Add space after colon. // 3. Strip whitepsaces around semicolon. // 4. Always end with semicolon return retval.replace( /(?:^|;)\s*([A-Z-_]+)(:\s*)/ig, function( match, property, colon ) { return property.toLowerCase() + ': '; } ) .replace( /\s+(?:;\s*|$)/g, ';' ) .replace( /([^;])$/g, '$1;' ); } return retval; }, /** * Whether control the runner manually instead of running on window onload. */ deferRunner : false };