<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://docs-old.ckeditor.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Garryyao</id>
		<title>CKSource Docs - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://docs-old.ckeditor.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Garryyao"/>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/Special:Contributions/Garryyao"/>
		<updated>2026-05-21T12:03:09Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.29.1</generator>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKEditor_3.x/Developers_Guide/Installation&amp;diff=5310</id>
		<title>CKEditor 3.x/Developers Guide/Installation</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKEditor_3.x/Developers_Guide/Installation&amp;diff=5310"/>
				<updated>2010-12-01T05:36:56Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: Add upgrade installation instructions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Installing CKEditor is a easy task. Just follow these simple steps: &lt;br /&gt;
&lt;br /&gt;
== Installation procedures ==&lt;br /&gt;
&lt;br /&gt;
=== Fresh installation ===&lt;br /&gt;
#'''Download''' the latest version of the editor from our web site: http://ckeditor.com/ &lt;br /&gt;
#'''Extract''' (decompress) the downloaded file to a directory called &amp;quot;ckeditor&amp;quot; in the root of your web site&lt;br /&gt;
'''Note:''' You can place the files in whichever path at your web site. &amp;quot;ckeditor&amp;quot; is the default one. &lt;br /&gt;
&lt;br /&gt;
=== Upgrade installation ===&lt;br /&gt;
# Rename your old editor folder to a backup, as e.g. &amp;quot;ckeditor_old&amp;quot;&lt;br /&gt;
# '''Extract''' (decompress) the downloaded file to the original editor directory, e.g. &amp;quot;ckeditor&amp;quot;&lt;br /&gt;
# Copy all configuration files that '''you have changed''' to their corresponding position in the new directory, these could includes but not limit to the following files:&lt;br /&gt;
* config.js&lt;br /&gt;
* content.css&lt;br /&gt;
* plugins/templates/templates/default.js&lt;br /&gt;
* plugins/styles/styles/default.js&lt;br /&gt;
* plugins/styles/styles/default.js&lt;br /&gt;
* plugins/pastefromword/filter/default.js&lt;br /&gt;
&lt;br /&gt;
== Verify the installation ==&lt;br /&gt;
&lt;br /&gt;
The editor comes with a few sample pages that can be used to verify that installation proceeded properly. Take a look at the _samples directory. &lt;br /&gt;
&lt;br /&gt;
To test your installation just call the following page at your web site: &lt;br /&gt;
&amp;lt;pre&amp;gt;http://&amp;amp;lt;your site&amp;amp;gt;/&amp;amp;lt;CKEditor installation path&amp;amp;gt;/_samples/index.html&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
http://www.example.com/ckeditor/_samples/index.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKeditor_3.x/Users_Guide/NonEditable_Contents&amp;diff=3727</id>
		<title>CKeditor 3.x/Users Guide/NonEditable Contents</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKeditor_3.x/Users_Guide/NonEditable_Contents&amp;diff=3727"/>
				<updated>2010-06-21T07:30:31Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
Non-editable, read-only contents in WYSIWYG mode document could be achieved by specifying the standard-compliant [http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#contenteditable contenteditable] attribute on the element, this will result in such element as well as it's content being '''unable to modify by editor keystrokes, commands and also dialogs''', while remains displaying in the same way as ordinary elements (except for some special cases, e.g. in IE, non-editable inline elements are displayed as 'inline-block') in editor, which makes it possible to present '''&amp;quot;placeholder&amp;quot;''' region that are not intended to be modified by the end user while keeps informatively rich (comparing to an image place holder).&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
The following HTML content defines one read-only paragraph and one other contains a non-editable span.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;First paragraph &amp;lt;b&amp;gt;editable&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p contenteditable=&amp;quot;false&amp;quot;&amp;gt;Second paragraph is read-only.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Third paragraph with &amp;lt;span contenteditable=&amp;quot;false&amp;quot;&amp;gt; non-editable content&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Editor behavior ==&lt;br /&gt;
# When executing an editor command, e.g. applying one style on a selection that contains such element, editor behaves as if the selection range is split up by this element into multiple slices of ranges thus the style are applied onto each range except for the element.&lt;br /&gt;
# When navigating inside the document with keytrokes, e.g. Left/Right Arrow, to move cross such element, cursor will avoid from  entering the element but jump over to the other side of it.&lt;br /&gt;
# The result of deletion requests, e.g. press Del/Backspace keys, beside such element is browser dependent, it will either delete the entire element (IE,Safari,Chrome) or preventing the element from removed (Firefox).&lt;br /&gt;
# Left single click on the non-editable element will select the entire element.&lt;br /&gt;
# Right single click to open context menu on non-editable element will not display menu items that could modify the element.&lt;br /&gt;
# Open dialogs on non-editable element will not load the element into dialog fields for modification.&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
* Nested editable element inside non-editable is not supported yet.&lt;br /&gt;
* Table element in IE can't be made as non-editable, see this [http://dev.fckeditor.net/ticket/5655 ticket].&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
Since CKEditor '''3.4'''&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKeditor_3.x/Users_Guide/NonEditable_Contents&amp;diff=3726</id>
		<title>CKeditor 3.x/Users Guide/NonEditable Contents</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKeditor_3.x/Users_Guide/NonEditable_Contents&amp;diff=3726"/>
				<updated>2010-06-17T16:11:05Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: Init page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
Non-editable, read-only contents in WYSIWYG mode document could be achieved by specifying the standard-compliant [http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#contenteditable contenteditable] attribute on the element, this will result in such element as well as it's content being '''unable to modify by editor keystrokes, commands and also dialogs''', while remains displaying in the same way as ordinary elements (except for some special cases, e.g. in IE, non-editable inline elements are displayed as 'inline-block') in editor, which makes it possible to present '''&amp;quot;placeholder&amp;quot;''' region that are not intended to be modified by the end user while keeps informatively rich (comparing to an image place holder).&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
The following HTML content defines one read-only paragraph and one other contains a non-editable span.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;First paragraph &amp;lt;b&amp;gt;editable&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p contenteditable=&amp;quot;false&amp;quot;&amp;gt;Second paragraph is read-only.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Third paragraph with &amp;lt;span contenteditable=&amp;quot;false&amp;quot;&amp;gt; non-editable content&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Editor behavior ==&lt;br /&gt;
# When executing an editor command, e.g. applying one style on a selection that contains such element, editor behaves as if the selection range is split up by this element into multiple slices of ranges thus the style are applied onto each range except for the element.&lt;br /&gt;
# When navigating inside the document with keytrokes, e.g. Left/Right Arrow, to move cross such element, cursor will avoid from  entering the element but jump over to the other side of it.&lt;br /&gt;
# The result of deletion requests, e.g. press Del/Backspace keys, beside such element is browser dependent, it will either delete the entire element (IE,Safari,Chrome) or preventing the element from removed (Firefox).&lt;br /&gt;
# Left single click on the non-editable element will select the entire element.&lt;br /&gt;
# Right single click to open context menu on non-editable element will not display menu items that could modify the element.&lt;br /&gt;
# Open dialogs on non-editable element will not load the element into dialog fields for modification.&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
* Nested editable element inside non-editable is not supported yet.&lt;br /&gt;
* Table element in IE can't be made as non-editable, see this [http://dev.fckeditor.net/ticket/5655 ticket].&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=FCKeditor_3.x/Design_and_Architecture/Coding_Style&amp;diff=2841</id>
		<title>FCKeditor 3.x/Design and Architecture/Coding Style</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=FCKeditor_3.x/Design_and_Architecture/Coding_Style&amp;diff=2841"/>
				<updated>2010-01-31T11:37:20Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: Adding two whitespaces rules.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Coding Style Guidelines =&lt;br /&gt;
&lt;br /&gt;
These guidelines where defined based on mixed common standards mainly related to Java programming. It aims to reflect the generally accepted standards for JavaScript coding with some minor adjustments.&lt;br /&gt;
&lt;br /&gt;
It is quite common to take the Java style to write JavaScript code, assuming it is a &amp;quot;cut-down&amp;quot; version of Java. Although JavaScript has an indirect relation with Java, apart from the similar &amp;quot;C     &lt;br /&gt;
== General Recommendations  ==&lt;br /&gt;
&lt;br /&gt;
Any violation to the guide is allowed if it enhances readability. &lt;br /&gt;
&lt;br /&gt;
If the name &amp;quot;CKEditor&amp;quot; is used, if must always be written with &amp;quot;CKE&amp;quot; uppercased concatenated with &amp;quot;ditor&amp;quot; in lowercase. The following usages are wrong: &amp;quot;CKeditor&amp;quot;, &amp;quot;ckEditor&amp;quot;, &amp;quot;CK Editor&amp;quot;, etc. Exceptions are made for directories and file names, which must always be lowercased, and the CKEDITOR namespace name. &lt;br /&gt;
&lt;br /&gt;
If the name &amp;quot;FCKeditor&amp;quot; is used, it must always be written with &amp;quot;FCK&amp;quot; uppercased concatenated with &amp;quot;editor&amp;quot; in lowercase. The following are wrong: &amp;quot;FckEditor&amp;quot;, &amp;quot;FCKEditor&amp;quot;, &amp;quot;fckEditor&amp;quot;, &amp;quot;FCK Editor&amp;quot;, and so on. Exception is made for directory names, where all chars &amp;quot;should&amp;quot; be in lowercase. &lt;br /&gt;
&lt;br /&gt;
The name &amp;quot;JavaScript&amp;quot; should be written with both the &amp;quot;J&amp;quot; and &amp;quot;S&amp;quot; in uppercase. The following are wrong: &amp;quot;Javascript&amp;quot;, &amp;quot;javascript&amp;quot;, etc.&lt;br /&gt;
&lt;br /&gt;
== Naming Conventions ==&lt;br /&gt;
&lt;br /&gt;
=== Generic Name Conventions  ===&lt;br /&gt;
&lt;br /&gt;
The ROOT namespace has a fixed name: CKEDITOR. &lt;br /&gt;
&amp;lt;pre&amp;gt;CKEDITOR&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Names representing namespaces must be all lowercase. &lt;br /&gt;
&amp;lt;pre&amp;gt;CKEDITOR.dom, CKEDITOR.env, CKEDITOR.ui&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Names representing public classes and public global objects must be in PascalCase. &lt;br /&gt;
&amp;lt;pre&amp;gt;CKEDITOR.dom.Document, CKEDITOR.Util&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Names representing constants must be all UPPERCASE. &lt;br /&gt;
&amp;lt;pre&amp;gt;CKEDITOR.STATUS_COMPLETE, CKEDITOR.EDITMODE_WYSIWYG, CKEDITOR.CTRL&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Names representing public methods must be verbs and written in camelCase. &lt;br /&gt;
&amp;lt;pre&amp;gt;appendStyleSheet(), getElement (), setTimeout()&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Names representing public properties must be nouns and written in camelCase. &lt;br /&gt;
&amp;lt;pre&amp;gt;name, document, targetWindow&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Names representing private methods must be verbs and written in camelCase prefixed with an underscore. &lt;br /&gt;
&amp;lt;pre&amp;gt;_doInternalStuff()&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Names representing private properties must be nouns and written in camelCase prefixed with an underscore. &lt;br /&gt;
&amp;lt;pre&amp;gt;_internalCounter, _prefix&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Abbreviations and acronyms should not be uppercase when used as name. &lt;br /&gt;
&amp;lt;pre&amp;gt;setHtml(), XmlDocument&lt;br /&gt;
NOT&lt;br /&gt;
setHTML(), XMLDocument&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
All names should be written in English.&lt;br /&gt;
&lt;br /&gt;
=== Specific Name Conventions ===&lt;br /&gt;
&lt;br /&gt;
The prefixes &amp;quot;get&amp;quot; and &amp;quot;set&amp;quot; may be used on methods that get or set properties which require computation.&lt;br /&gt;
&amp;lt;pre&amp;gt;setArrayCount(), getFormattedValue()&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The prefix &amp;quot;checkIs&amp;quot; may be used on methods which return boolean states which require computation.&lt;br /&gt;
&amp;lt;pre&amp;gt;checkIsValid(), checkIsEmpty()&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Abbreviations in names should be avoided.&lt;br /&gt;
&amp;lt;pre&amp;gt;getDirectoryName(), applicationCommand&lt;br /&gt;
NOT&lt;br /&gt;
getDirName(), appCmd&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
All files must be named in all lower case.&lt;br /&gt;
&lt;br /&gt;
Classes and global objects should be declared in individual files with the file name matching the class/object name.&lt;br /&gt;
&amp;lt;pre&amp;gt;fckbrowserinfo.js, fcktoolbarbutton.js&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Layout  ==&lt;br /&gt;
&lt;br /&gt;
For indentation, the TAB should be used. Development IDEs should be configured to represent TABs as 4 spaces. &lt;br /&gt;
&amp;lt;pre&amp;gt;if ( test )&lt;br /&gt;
{&lt;br /&gt;
    if ( otherTest )&lt;br /&gt;
        doSomething();&lt;br /&gt;
    doMore();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Block layout should be as illustrated. &lt;br /&gt;
&amp;lt;pre&amp;gt;while (&amp;amp;nbsp;!done )&lt;br /&gt;
{&lt;br /&gt;
    doSomething();&lt;br /&gt;
    done = moreToDo();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Single statement (single line only) if/else/while/for could (preferably) be written without brackets, but never in the same line. &lt;br /&gt;
&amp;lt;pre&amp;gt;if ( condition )&lt;br /&gt;
    statement;&lt;br /&gt;
&lt;br /&gt;
while ( condition )&lt;br /&gt;
    statement;&lt;br /&gt;
&lt;br /&gt;
for ( initialization&amp;amp;nbsp;; condition&amp;amp;nbsp;; update )&lt;br /&gt;
    statement;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The above rule is not valid for nested blocks, like the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;if ( condition )&lt;br /&gt;
{&lt;br /&gt;
    if ( anotherCondition )&lt;br /&gt;
        statement;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// WRONG:&lt;br /&gt;
if ( condition )&lt;br /&gt;
    if ( anotherCondition )&lt;br /&gt;
        statement;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The incompleteness of split lines must be made obvious. &lt;br /&gt;
&amp;lt;pre&amp;gt;totalSum = a + b + c + &lt;br /&gt;
    d + e; &lt;br /&gt;
&lt;br /&gt;
method( param1, param2,&lt;br /&gt;
    param3 ); &lt;br /&gt;
&lt;br /&gt;
setText( 'Long line split' + &lt;br /&gt;
    'into two parts.' );&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Whitespace  ===&lt;br /&gt;
&amp;quot;If&amp;quot; parentheses should be surround by whitespaces.&lt;br /&gt;
&amp;lt;pre&amp;gt;if ( true ) return;&lt;br /&gt;
NOT&lt;br /&gt;
if( true )return;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Conventional operators should be surrounded by a space (including ternary operators). &lt;br /&gt;
&amp;lt;pre&amp;gt;if ( i &amp;amp;gt; 3 &amp;amp;amp;&amp;amp;amp; test == 'yes' )&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Commas should be followed by a space. &lt;br /&gt;
&amp;lt;pre&amp;gt;function myFunction( parm1, param2, param3 )&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Semi-colons in for statements should be surrounded by a space. &lt;br /&gt;
&amp;lt;pre&amp;gt;for ( var i = 0&amp;amp;nbsp;; i &amp;amp;lt; count&amp;amp;nbsp;; i++ )&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Semi-colons should not be preceded by a space. &lt;br /&gt;
&amp;lt;pre&amp;gt;doSomething();&lt;br /&gt;
var name = 'John';&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Colons should be surrounded by a space. &lt;br /&gt;
&amp;lt;pre&amp;gt;case 100&amp;amp;nbsp;:&lt;br /&gt;
NOT&lt;br /&gt;
case 100:&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Opening parenthesis must be followed by a space and closing parenthesis must be preceded by a space. &lt;br /&gt;
&amp;lt;pre&amp;gt;if ( myVar == 1 )&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
There special cases where no space is recommended. When opening parenthesis for a &amp;quot;self-executing anonymous function&amp;quot; and when closing parenthesis after an indented code block:&lt;br /&gt;
&amp;lt;pre&amp;gt;(function()&lt;br /&gt;
{&lt;br /&gt;
    // Code here&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
myMethod( function()&lt;br /&gt;
    {&lt;br /&gt;
        // Code here&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Functions/method calls should not be followed by a space. &lt;br /&gt;
&amp;lt;pre&amp;gt;doSomething( someParameter );&lt;br /&gt;
NOT&lt;br /&gt;
doSomething ( someParameter );&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Logical units within a block should be separated by one blank line. &lt;br /&gt;
&amp;lt;pre&amp;gt;// Create a new identity matrix&lt;br /&gt;
var matrix = new Matrix4x4();&lt;br /&gt;
&lt;br /&gt;
// Precompute angles for efficiency &lt;br /&gt;
var cosAngle = mathCos( angle );&lt;br /&gt;
var sinAngle = mathSin( angle );&lt;br /&gt;
&lt;br /&gt;
// Specify matrix as a rotation transformation &lt;br /&gt;
matrix.setElement( 1, 1, cosAngle );&lt;br /&gt;
matrix.setElement( 1, 2, sinAngle ); &lt;br /&gt;
matrix.setElement( 2, 1, -sinAngle );&lt;br /&gt;
matrix.setElement( 2, 2, cosAngle );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Apply rotation&lt;br /&gt;
transformation.multiply( matrix );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Second line of a multiple variables declarations should have a single tab proceeded.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var example = 1,&lt;br /&gt;
     sample = 2;&lt;br /&gt;
NOT&lt;br /&gt;
var example = 1,&lt;br /&gt;
    sample = 2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variables  ==&lt;br /&gt;
&lt;br /&gt;
Variables must be always defined with &amp;quot;var&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Function parameters must be in camelCase. &lt;br /&gt;
&amp;lt;pre&amp;gt;function sum( firstNumber, secondNumber )&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Local variables must be in camelCase. &lt;br /&gt;
&amp;lt;pre&amp;gt;function doSomething()&lt;br /&gt;
{&lt;br /&gt;
    var colorOne = 1;&lt;br /&gt;
    var colorTwo = 2;&lt;br /&gt;
&lt;br /&gt;
    return colorOne + colorTwo;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Several variables can be defined with a single var statement, but only if their initialization values are in single lines. Do not initialize more than one variable is a single line: &lt;br /&gt;
&amp;lt;pre&amp;gt;var aVar, someVar,&lt;br /&gt;
    other1Var = 10,&lt;br /&gt;
    other2Var = 25,&lt;br /&gt;
    isVar = true;&lt;br /&gt;
&lt;br /&gt;
var longVar = function()&lt;br /&gt;
{&lt;br /&gt;
    // This var takes more than one line.&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var objVar =&lt;br /&gt;
{&lt;br /&gt;
    // This var takes more than one line.&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comments  ==&lt;br /&gt;
&lt;br /&gt;
Tricky code should not be commented but rewritten: In general, the use of comments should be minimized by making the code self-documenting by appropriate name choices and an explicit logical structure. &lt;br /&gt;
&lt;br /&gt;
All comments should be written in English. Whenever possible, end comments with a period as normal phrases, and wrap comments within the first 80 characters of each line. &lt;br /&gt;
&lt;br /&gt;
There should be a space after the comment identifier. &lt;br /&gt;
&amp;lt;pre&amp;gt;// This is a comment.   NOT: //This is a comment &lt;br /&gt;
/**                     NOT: /** &lt;br /&gt;
* This is block               *This is a block &lt;br /&gt;
* comment.                    *comment &lt;br /&gt;
*/                            */&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Note that comment blocks should be opened with two asterisks only for documentation purposes. See [[FCKeditor 3.x/Design and Architecture/Documentation#JavaScript_API|JavaScript API Documentation]].&lt;br /&gt;
&lt;br /&gt;
== Regular Expressions ==&lt;br /&gt;
&lt;br /&gt;
The '''regular expression literal''' should be used whenever possible, instead of the RegExp object, which should be used only when the regular expression pattern is not constant or depends on runtime computation.&lt;br /&gt;
&amp;lt;pre&amp;gt;/^foo\s*/i&lt;br /&gt;
NOT&lt;br /&gt;
new RegExp( '^foo\s*', 'i' )&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Other than shortnesses and better readability, regular expression literals are compiled during script evaluation, which improves performance at runtime.&lt;br /&gt;
&lt;br /&gt;
== File Headers  ==&lt;br /&gt;
&lt;br /&gt;
There are minimum requirements for us to be able to make our code available to the world. Most of them are related to legal needs, which help us protecting the project from abuses. &lt;br /&gt;
&lt;br /&gt;
Here is a JavaScript template for the header to be included in the source code: &lt;br /&gt;
&amp;lt;pre&amp;gt;/*&lt;br /&gt;
Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.&lt;br /&gt;
For licensing, see LICENSE.html or http://ckeditor.com/license&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Of course, different languages have different commenting syntax, so it is enough to copy the header from an existing file to maintain the style. &lt;br /&gt;
&lt;br /&gt;
=== Author Tags  ===&lt;br /&gt;
&lt;br /&gt;
Author names, e-mails or web site addresses should be avoided in the header. To justify that, let me recall a citation from Sander Striker, a member of the Apache Software Foundation, that can be found at [http://producingoss.com/en/managing-volunteers.html#territoriality Producing Open Source Software]: &lt;br /&gt;
&amp;lt;blockquote&amp;gt;At the Apache Software foundation we discourage the use of author tags in source code. There are various reasons for this, apart from the legal ramifications. Collaborative development is about working on projects as a group and caring for the project as a group. Giving credit is good, and should be done, but in a way that does not allow for false attribution, even by implication. There is no clear line for when to add or remove an author tag. Do you add your name when you change a comment? When you put in a one-line fix? Do you remove other author tags when you refactor the code and it looks 95% different? What do you do about people who go about touching every file, changing just enough to make the virtual author tag quota, so that their name will be everywhere?&amp;lt;br&amp;gt; &amp;lt;/blockquote&amp;gt; &amp;lt;blockquote&amp;gt;&lt;br /&gt;
There are better ways to give credit, and our preference is to use those. From a technical standpoint author tags are unnecessary; if you wish to find out who wrote a particular piece of code, the version control system can be consulted to figure that out. Author tags also tend to get out of date. Do you really wish to be contacted in private about a piece of code you wrote five years ago and were glad to have forgotten?&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
The SVN is a good place to understand user participation. Even when committing changes proposed by Joe White, it is nice to add a comment like &amp;quot;Thanks to Joe White.&amp;quot; in the commit message.&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=FCKeditor_3.x/Design_and_Architecture/Dialog_System&amp;diff=2739</id>
		<title>FCKeditor 3.x/Design and Architecture/Dialog System</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=FCKeditor_3.x/Design_and_Architecture/Dialog_System&amp;diff=2739"/>
				<updated>2009-11-01T16:49:57Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The new dialog system in CKEditor is to be written from scratch. One of the key things in CKEditor is that it doesn't rely on HTML pages to run. Everything is created on the fly in JavaScript. In this way, we avoid limitations about cross domain serving of the editor code, like CDN solutions, and enhance the editor performance. &lt;br /&gt;
&lt;br /&gt;
== Framework  ==&lt;br /&gt;
&lt;br /&gt;
Dialogs will be controlled by the Dialog System Framework. This system offer features to define, modify and use dialogs within the editor. It brings uniform design among the dialogs, as well as advanced features with easy. &lt;br /&gt;
&lt;br /&gt;
== Dialog Manager  ==&lt;br /&gt;
&lt;br /&gt;
The Dialog Manager is the core of the dialog system. It introduces API features to open and manage dialogs in the editor. It also creates the basic structure of the dialog, the dialog framework, and loads the dialog contents. It manages dialog contents validation and provides the features to be used by the dialog definition object. &lt;br /&gt;
&lt;br /&gt;
== Main API  ==&lt;br /&gt;
&lt;br /&gt;
The dialog system runs under the CKEDITOR.dialog namespace. Its code is to be defined in the &amp;quot;dialog&amp;quot; plugin. &lt;br /&gt;
&lt;br /&gt;
The dialog plugin extends the CKEDITOR.editor class, by adding the &amp;quot;'''CKEDITOR.editor.openDialog'''&amp;quot; function. This function is relative to the editor instance, because dialogs are sensitive to its configurations, as well as to its contents and selection state. &lt;br /&gt;
&lt;br /&gt;
== Structure  ==&lt;br /&gt;
&lt;br /&gt;
In a macro structure definition, a dialog is composed by the following pieces: &lt;br /&gt;
&lt;br /&gt;
*'''Cover''': a semi transparent element which is placed over the entire page to give the user a &amp;quot;modal dialog&amp;quot; effect. The user is required to close the dialog to access the page again.&lt;br /&gt;
&lt;br /&gt;
*'''Main Dialog Structure''': a floating element that holds the dialog structure. This structure defines several elements that are common to all dialogs:&amp;lt;br&amp;gt;&lt;br /&gt;
**'''Title''': a title space for the dialog.&lt;br /&gt;
**'''Close button''': an element that closes the dialog on click. &lt;br /&gt;
**'''Buttons space''': a space reserved to the main dialog buttons, like the &amp;quot;OK&amp;quot; and &amp;quot;Cancel&amp;quot; buttons. &lt;br /&gt;
**'''Resize handle''': the element to be used to resize the dialog, if resizable. &lt;br /&gt;
**'''Contents''': the space where the dialog contents are to be rendered. &lt;br /&gt;
**'''Tabs Space''': the space where dialog tabs are to be rendered. Each tab fills the Contents space with different contents.&lt;br /&gt;
&lt;br /&gt;
The following is a sample graphical representation of this structure: &lt;br /&gt;
&amp;lt;pre&amp;gt;+---------------------------------------+&lt;br /&gt;
| (Cover)                               |&lt;br /&gt;
|     +---------------------------+     |&lt;br /&gt;
|     | (Title)               (x) |     |&lt;br /&gt;
|     |---------------------------|     |&lt;br /&gt;
|     | (Tabs)                    |     |&lt;br /&gt;
|     |---------------------------|     |&lt;br /&gt;
|     | (Contents)                |     |&lt;br /&gt;
|     |                           |     |&lt;br /&gt;
|     |                           |     |&lt;br /&gt;
|     |                           |     |&lt;br /&gt;
|     |                           |     |&lt;br /&gt;
|     |                           |     |&lt;br /&gt;
|     |                           |     |&lt;br /&gt;
|     |---------------------------|     |&lt;br /&gt;
|     |              (Buttons) (/)|     |&lt;br /&gt;
|     +---------------------------+     |&lt;br /&gt;
|                                       |&lt;br /&gt;
+---------------------------------------+&lt;br /&gt;
&lt;br /&gt;
(x) = Close button&lt;br /&gt;
(/) = Resize handle&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The main dialog structure is defined by the editor theme, by its &amp;quot;buildDialog&amp;quot; function. This function returns the HTML for the main dialog structure, as well as the information needed by the dialog system to render it properly and fill its &amp;quot;placeholders&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Dialog Definition  ==&lt;br /&gt;
&lt;br /&gt;
When opening a dialog, the &amp;quot;Dialog Definition&amp;quot; is to be passed to the dialog system. This definition must be first &amp;quot;registered&amp;quot;, to be then called later. The following function can be used to register it: &lt;br /&gt;
&amp;lt;pre&amp;gt;CKEDITOR.dialog.add( 'dialog name', function( editor )&lt;br /&gt;
	{&lt;br /&gt;
		return { ... definition ... };&lt;br /&gt;
	) );&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
CKEDITOR.dialog.add( 'dialog name', 'definition file path.js' );&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Note that the definition can either be passed to the dialog system directly, or even be found in a separated JavaScript file. The dialog system will then use a callback system to download the file and load the definition. The definition file should have the add() function call to register the dialog again, just like the first of the above examples. The definitions are then cached and reused by all editor instances. &lt;br /&gt;
&lt;br /&gt;
The definition is a function that receives an editor instance. This function is called every time a dialog is to be displayed. It then returns the definition object, which may be customized for that specific instance. The following is a compact representation of this object: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
	title: 'Dialog Title',&lt;br /&gt;
&lt;br /&gt;
	resizable: CKEDITOR.DIALOG_RESIZE_NONE,&lt;br /&gt;
&lt;br /&gt;
	minWidth: {number},&lt;br /&gt;
&lt;br /&gt;
	minHeight: {number},&lt;br /&gt;
&lt;br /&gt;
	buttons: [ ... ],&lt;br /&gt;
&lt;br /&gt;
	contents: [ ... ],&lt;br /&gt;
&lt;br /&gt;
	onOk: function() { ... },&lt;br /&gt;
&lt;br /&gt;
	onCancel: function() { ... },&lt;br /&gt;
&lt;br /&gt;
	onLoad: function( data ) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Only the &amp;quot;title&amp;quot; and &amp;quot;contents&amp;quot; properties are required. Other properties have their default values. &lt;br /&gt;
&lt;br /&gt;
Plugins or user code may at any time change the dialog definition, adding or removing things from it. It is enough to listen for the &amp;quot;dialogDefinition&amp;quot; event in the CKEDITOR object. The definition can also be retrieved at any time after it with the CKEDITOR.dialog.get function. &lt;br /&gt;
&lt;br /&gt;
Dialogs are not resizable by default. If any of the resize constants are defined (CKEDITOR.DIALOG_RESIZE_HEIGHT | CKEDITOR.DIALOG_RESIZE_WIDHT | CKEDITOR.DIALOG_RESIZE_BOTH), the resize handle will be displayed. The size of the &amp;quot;contents&amp;quot; placeholder is changed when resizing, and the minWidth and minHeight properties are respected. &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;onOk&amp;quot; and &amp;quot;onCancel&amp;quot; are properties that can be set to functions to be called when one of the standard buttons is clicked. If the function explicitly returns &amp;quot;false&amp;quot;, the dialog don't get closed. &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;onLoad&amp;quot; function is called when the dialog is loaded. An empty &amp;quot;data&amp;quot; object is passed to it. This object may get filled by the function with data to be reused by the dialog elements. &lt;br /&gt;
&lt;br /&gt;
=== Buttons Definition  ===&lt;br /&gt;
&lt;br /&gt;
By default, the &amp;quot;Cancel&amp;quot; button is available on dialogs. The definition can instead contain a list of buttons to be displayed. The following is an example of the buttons property definition: &lt;br /&gt;
&amp;lt;pre&amp;gt;buttons: [&lt;br /&gt;
	CKEDITOR.dialog.okButton,&lt;br /&gt;
&lt;br /&gt;
	CKEDITOR.dialog.cancelButton,&lt;br /&gt;
&lt;br /&gt;
	{&lt;br /&gt;
		id: 'unique name',&lt;br /&gt;
                type: 'button',&lt;br /&gt;
		label: 'Custom Button',&lt;br /&gt;
		title: 'Button description',&lt;br /&gt;
		accessKey: 'C',&lt;br /&gt;
		disabled: false,&lt;br /&gt;
		onClick: function()&lt;br /&gt;
			{&lt;br /&gt;
				// code on click&lt;br /&gt;
			},&lt;br /&gt;
	}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Note that special objects are available for the &amp;quot;Ok&amp;quot; and &amp;quot;Cancel&amp;quot; buttons. Those objects are actually functions, which accept an object that overrides their default properties. For example, if you want the &amp;quot;Ok&amp;quot; button to be labeled &amp;quot;Go&amp;quot;, just do this: &lt;br /&gt;
&amp;lt;pre&amp;gt;buttons: [&lt;br /&gt;
	CKEDITOR.dialog.okButton( {&lt;br /&gt;
			label: 'Go'&lt;br /&gt;
		}),&lt;br /&gt;
&lt;br /&gt;
	CKEDITOR.dialog.cancelButton&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The &amp;quot;id&amp;quot; property can be defined on custom buttons. It makes it possible to retrieve a specific button at runtime to execute special functions on it, like enabling/disabling it, or even triggering its click. &lt;br /&gt;
&lt;br /&gt;
We encourage defining an access key for each custom button. It should be a keyboard keystroke, which will be then combined with the CTRL key. The Ok and Cancel buttons can be fired with the ENTER and ESC key, respectively. &lt;br /&gt;
&lt;br /&gt;
=== Contents Definition  ===&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;contents&amp;quot; property is the most important in the definition. It defines the actual dialog contents. Note that this property is an array. Each entry in this array is an object. Each object will be represented by a &amp;quot;tab&amp;quot; in the dialog. No tabs are shown if just one object is defined. &lt;br /&gt;
&lt;br /&gt;
The following is the compact representation of a single contents object: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
	id: 'unique name',&lt;br /&gt;
	label: 'Tab Label',&lt;br /&gt;
	title: 'Contents description',&lt;br /&gt;
	accessKey: 'Q',&lt;br /&gt;
	elements&amp;amp;nbsp;: [ ... ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Just like the buttons, here again we have id, label, title and access key to be defined for each content object. It is possible to activate one of the tabs by using the CTRL + access key. It is also possible to switching between the tabs by hitting CTRL+SPACE (forward) and CTRL+SHIFT+SPACE (backward). &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;elements&amp;quot; array contains the UI element definitions for this contents object. Details can be found in the next section. &lt;br /&gt;
&lt;br /&gt;
== UI Elements  ==&lt;br /&gt;
&lt;br /&gt;
The inner part of the dialog is finally filled with &amp;quot;UI elements&amp;quot;. For example, the following is a possible definition for a simple text field: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
	id: 'width',&lt;br /&gt;
	type: 'text',&lt;br /&gt;
	label: editor.lang.width,&lt;br /&gt;
	title: editor.lang.widthTitle,&lt;br /&gt;
	default: '120',&lt;br /&gt;
	className: 'anyClass',&lt;br /&gt;
	style: 'someStyles',&lt;br /&gt;
	onLoad: function( data ) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Most of the properties are optional, including &amp;quot;id&amp;quot; property, but it is recommended as it makes it easier to customize the dialog. &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;type&amp;quot; property is required. It indicates which &amp;quot;UI element builder&amp;quot; to use for this element. The dialog core code provides only two element types, &amp;quot;vbox&amp;quot; and &amp;quot;hbox&amp;quot;, which are containers for other elements: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
	type: 'vbox|hbox', &lt;br /&gt;
	children: [ ... ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The &amp;quot;vbox&amp;quot; element will dispose all children elements vertically, one bellow the other. The &amp;quot;hbox&amp;quot; element will place then one next to the other horizontally instead. &lt;br /&gt;
&lt;br /&gt;
The main contents placeholder itself is rendered by a vbox element object. &lt;br /&gt;
&lt;br /&gt;
=== Defining Elements  ===&lt;br /&gt;
&lt;br /&gt;
Plugins or inline code can easily define new dialog UI elements to be used inside the dialogs. For that, &amp;quot;UI element builders&amp;quot; must be registered with the following call: &lt;br /&gt;
&amp;lt;pre&amp;gt;CKEDITOR.dialog.addUIElement( 'type name', &lt;br /&gt;
	{	&lt;br /&gt;
		build&amp;amp;nbsp;: function( elementDefinition, output )&lt;br /&gt;
		{&lt;br /&gt;
			// render the element to the output (Array) &lt;br /&gt;
&lt;br /&gt;
			return {&lt;br /&gt;
				setValue&amp;amp;nbsp;: function( value, resetChanged )&lt;br /&gt;
				{&lt;br /&gt;
					// set the element value, based on the elementBag&lt;br /&gt;
					// information.&lt;br /&gt;
				},&lt;br /&gt;
&lt;br /&gt;
				getValue&amp;amp;nbsp;: function()&lt;br /&gt;
				{&lt;br /&gt;
					// returns the current value.&lt;br /&gt;
				},&lt;br /&gt;
&lt;br /&gt;
				isChanged&amp;amp;nbsp;: function()&lt;br /&gt;
				{&lt;br /&gt;
					// returns a Boolean indicating that the value&lt;br /&gt;
					// has been changed.&lt;br /&gt;
				},&lt;br /&gt;
&lt;br /&gt;
				focus&amp;amp;nbsp;: function()&lt;br /&gt;
				{&lt;br /&gt;
				}&lt;br /&gt;
			};&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The elementDefinition parameter is the exact element object taken from the dialog definition. If the element handles children elements, it is also responsible for calling the build function for those elements. &lt;br /&gt;
&lt;br /&gt;
The build function returns an object, which will be used to handle this element at runtime. &lt;br /&gt;
&lt;br /&gt;
=== Elements Plugin  ===&lt;br /&gt;
&lt;br /&gt;
The editor comes with the &amp;quot;dialogui&amp;quot; plugin, which defines the most common dialog UI elements types: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
	type&amp;amp;nbsp;: 'text',&lt;br /&gt;
	label&amp;amp;nbsp;: 'Label Text',&lt;br /&gt;
	title&amp;amp;nbsp;: 'Field description',&lt;br /&gt;
	default&amp;amp;nbsp;: '...',&lt;br /&gt;
	className: '...',&lt;br /&gt;
	style: '...',&lt;br /&gt;
	required: true/false,&lt;br /&gt;
	validate: function() { ... }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	type&amp;amp;nbsp;: 'select',&lt;br /&gt;
	label&amp;amp;nbsp;: 'Label Text',&lt;br /&gt;
	title&amp;amp;nbsp;: 'Field description',&lt;br /&gt;
	default&amp;amp;nbsp;: '...',&lt;br /&gt;
	className: '...',&lt;br /&gt;
	style: '...',&lt;br /&gt;
	required: true/false,&lt;br /&gt;
	validate: function() { ... }&lt;br /&gt;
	items:&lt;br /&gt;
	[&lt;br /&gt;
		[ 'Label 1', 'Value' ],&lt;br /&gt;
		[ 'Label 2' ]  // Value is 'Label 2'&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	type&amp;amp;nbsp;: 'radio',&lt;br /&gt;
	label&amp;amp;nbsp;: 'Label Text',&lt;br /&gt;
	title&amp;amp;nbsp;: 'Field description',&lt;br /&gt;
	default&amp;amp;nbsp;: '...',&lt;br /&gt;
	className: '...',&lt;br /&gt;
	style: '...',&lt;br /&gt;
	required: true/false,&lt;br /&gt;
	validate: function() { ... },&lt;br /&gt;
	items:&lt;br /&gt;
	[&lt;br /&gt;
		[ 'Label 1', 'Value', 'Title' ],&lt;br /&gt;
		[ 'Label 2' ]  // Value and Title are 'Label 2'&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	type&amp;amp;nbsp;: 'checkbox',&lt;br /&gt;
	label&amp;amp;nbsp;: 'Label Text',&lt;br /&gt;
	title&amp;amp;nbsp;: 'Field description',&lt;br /&gt;
	checked&amp;amp;nbsp;: true|false,&lt;br /&gt;
	className: '...',&lt;br /&gt;
	style: '...',&lt;br /&gt;
	required: true/false,&lt;br /&gt;
	validate: function() { ... }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	type&amp;amp;nbsp;: 'button',&lt;br /&gt;
	label&amp;amp;nbsp;: 'Label Text',&lt;br /&gt;
	title&amp;amp;nbsp;: 'Field description',&lt;br /&gt;
	className: '...',&lt;br /&gt;
	style: '...',&lt;br /&gt;
	onClick&amp;amp;nbsp;: function(){ ... }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	type&amp;amp;nbsp;: 'html',&lt;br /&gt;
	className: '...',&lt;br /&gt;
	style: '...',&lt;br /&gt;
	html: 'Some &amp;amp;lt;b&amp;amp;gt;HTML&amp;amp;lt;/b&amp;amp;gt;'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Workflow  ==&lt;br /&gt;
&lt;br /&gt;
When loading the dialog: &lt;br /&gt;
&lt;br /&gt;
*editor.openDialog( 'dialogName' ) is called. &lt;br /&gt;
*The dialog system shows the cover (hourglass icon). &lt;br /&gt;
*The dialog definition for 'dialogName' is loaded. &lt;br /&gt;
*If needed, the dialog definition is downloaded. &lt;br /&gt;
*editor.theme.buildDialog() is called returning the main structure HTML &lt;br /&gt;
*The main structure HTML is injected into the DOM (hidden). &lt;br /&gt;
*Based on the dialog definition, the dialog system fills the dialog title, enables the resize handler and creates the dialog buttons. &lt;br /&gt;
*The &amp;quot;onLoad&amp;quot; function is called for the dialog definition. &lt;br /&gt;
*Tabs are created for the content objects. &lt;br /&gt;
*The &amp;quot;onLoad&amp;quot; is called for each UI elements defined (recursively on children elements also). &lt;br /&gt;
*All elements in the content object to be displayed are rendered. &lt;br /&gt;
*The resulting rendered HTML is injected into the DOM. &lt;br /&gt;
*The dialog is displayed (normal icon).&lt;br /&gt;
&lt;br /&gt;
When hitting Ok: &lt;br /&gt;
&lt;br /&gt;
*The &amp;quot;validate&amp;quot; function is called for each element. If any of them is invalid, the focus is moved to it, and a standard UI alert is displayed. &lt;br /&gt;
*The &amp;quot;onOk&amp;quot; function is called. &lt;br /&gt;
*If &amp;quot;onOk&amp;quot; doesn't return &amp;quot;false&amp;quot;, the dialog gets destroyed.&lt;br /&gt;
&lt;br /&gt;
When hitting Cancel: &lt;br /&gt;
&lt;br /&gt;
*The &amp;quot;isChanged&amp;quot; function is called for each element. If any of then has been changed, a standard warning message is displayed (&amp;quot;Are you sure blah blah...?&amp;quot;). &lt;br /&gt;
*The &amp;quot;onCancel&amp;quot; function is called. &lt;br /&gt;
*If &amp;quot;onCancel&amp;quot; doesn't return &amp;quot;false&amp;quot;, the dialog gets destroyed.&lt;br /&gt;
&lt;br /&gt;
== Dialog Definition API Extensions  ==&lt;br /&gt;
&lt;br /&gt;
Once registered, a dialog definition gets &amp;quot;extended&amp;quot; by the dialog system. A few API functions are added to it, making it possible to manipulate it: &lt;br /&gt;
&lt;br /&gt;
*getContents( 'id' ): gets a specific contents object, by id. &lt;br /&gt;
*getButton( 'id' ): gets a specific button object, by id. &lt;br /&gt;
*addContents( { ... contents object } [, nextSiblingId] ): adds a content object to the definitions. If the second parameter is specify, the added object is placed before the object with that id, otherwise it is appended to the end. &lt;br /&gt;
*addButton( { ... button object } [,nextSiblingId] ): the same exact behavior of addContents, but for the buttons. &lt;br /&gt;
*removeContents( 'id' ): removes one of the contents objects. &lt;br /&gt;
*removeButton( 'id' ): removes one of the buttons.&lt;br /&gt;
&lt;br /&gt;
Contents objects are extended with the following functions: &lt;br /&gt;
&lt;br /&gt;
*get( 'id' ): gets one of the UI elements by id. &lt;br /&gt;
*add( { ... element definition } [,nextSiblingId] ): just like addContents, it adds UI elements to the list. &lt;br /&gt;
*remove( 'id' ): removes one of the UI elements.&lt;br /&gt;
&lt;br /&gt;
Button object are extended with the following functions: &lt;br /&gt;
&lt;br /&gt;
*enable(): enables the button. &lt;br /&gt;
*disable(): disables the button.&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/&amp;diff=2701</id>
		<title>CKTester/</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/&amp;diff=2701"/>
				<updated>2009-09-25T09:48:30Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: New page: *User's Guide  *Test Runners&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[CKTester/Users_Guide|User's Guide]] &lt;br /&gt;
*[[CKTester/Runners|Test Runners]]&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Runners&amp;diff=2700</id>
		<title>CKTester/Runners</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Runners&amp;diff=2700"/>
				<updated>2009-09-25T09:45:49Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
'''Test runners''' are JavaScript testing frameworks used in the [[CKTester/Users_Guide#Test_Cell|cells]], which are deployed under '/runners' folder of the CKTester project. Currently the following runners are supported:&lt;br /&gt;
# [http://developer.yahoo.com/yui/yuitest/ YUI Unit Test]&lt;br /&gt;
# [[CKTester/ManualTestRunner|CKTester Manual Runner]]&lt;br /&gt;
&lt;br /&gt;
== Runner Extension ==&lt;br /&gt;
Sometimes runner doesn't work with CKTester naturally( e.g. YUI Unit Test ), the integration efforts are delivered as extensions scripts which will enhance/integrate the runner at run time.&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Runners&amp;diff=2699</id>
		<title>CKTester/Runners</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Runners&amp;diff=2699"/>
				<updated>2009-09-25T09:44:01Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: New page: == Overview == Runners are JavaScript testing frameworks used in the cells, which are deployed under '/runners' folder of the CKTester project. Currently the foll...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Runners are JavaScript testing frameworks used in the [[Users_Guide#Test_Cell|cells]], which are deployed under '/runners' folder of the CKTester project. Currently the following runners are supported:&lt;br /&gt;
# [http://developer.yahoo.com/yui/yuitest/ YUI Unit Test]&lt;br /&gt;
# [[CKTester/ManualTestRunner|CKTester Manual Runner]]&lt;br /&gt;
&lt;br /&gt;
== Runner Extension ==&lt;br /&gt;
Sometimes the runner doesn't work with CKTester naturally( e.g. YUI Unit Test ), the integration efforts are delivered as extensions scripts which will enhance/integrate the runner at run time.&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/ManualTestRunner&amp;diff=2698</id>
		<title>CKTester/ManualTestRunner</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/ManualTestRunner&amp;diff=2698"/>
				<updated>2009-09-25T09:31:36Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
The '''manual testing runner''' is one type of our internal runners which dedicate to functional testing that are impossible to deliver with automation. It's designed to help developers/reports authoring and viewing manual testing scripts with ease, and with the ability to seamlessly integrate with [[CKTester/Users Guide|CKTester]].&lt;br /&gt;
&lt;br /&gt;
== Cell Config&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
In order to have the cell been indentified as a manual testing case, the [[CKTester/Users Guide#Tags|tag]] ''''manual'''' is required.&lt;br /&gt;
&lt;br /&gt;
== Script Authoring  ==&lt;br /&gt;
&lt;br /&gt;
You could write the manual testing procedures( scripts ) in your preferred language, currently the following language are supported: &lt;br /&gt;
&lt;br /&gt;
=== Trac Wiki  ===&lt;br /&gt;
&lt;br /&gt;
Write the scripts inside a &amp;amp;lt;pre&amp;amp;gt; tag at the beginning of doc body indicate the '''TracWiki format''' is under use: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;pre&amp;amp;gt;&lt;br /&gt;
=== TC 1 ===&lt;br /&gt;
 1. Step1;&lt;br /&gt;
 1. Step2;&lt;br /&gt;
 1. Step3;&lt;br /&gt;
 * Expected Result: The output codes of editor should be:&lt;br /&gt;
{{{&lt;br /&gt;
   Output data...&lt;br /&gt;
}}}&lt;br /&gt;
 * Actual Result: JavaScript error thrown.&lt;br /&gt;
&amp;amp;lt;/pre&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== HTML  ===&lt;br /&gt;
&lt;br /&gt;
Write the scripts inside a &amp;amp;lt;div&amp;amp;gt; tag at the beginning of doc body indicate the '''HTML''' is under use: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;div&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;ol&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step1;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step2;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step3;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;/ol&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Expected Result: The output codes of editor should be:&lt;br /&gt;
			&amp;amp;lt;pre&amp;amp;gt;&lt;br /&gt;
				Output data...&lt;br /&gt;
			&amp;amp;lt;/pre&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Actual Result: JavaScript error thrown.&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/div&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
=== Test Decision  ===&lt;br /&gt;
&lt;br /&gt;
The most important step is to give a judgment to the test's final result after reproducing the procedures. A ''''PASS'''' button along with a &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;'&amp;lt;/span&amp;gt;'''FAIL'''' button are provided to achieve this, once the decision is made, the cell will be closed and result are report to the [[CKTester/Users_Guide#Fort|fort]].&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/ManualTestRunner&amp;diff=2697</id>
		<title>CKTester/ManualTestRunner</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/ManualTestRunner&amp;diff=2697"/>
				<updated>2009-09-25T09:30:57Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
The '''manual testing runner''' is one type of our internal runners which dedicate to functional testing that are impossible to deliver with automation. It's designed to help developers/reports authoring and viewing manual testing scripts with ease, and with the ability to seamlessly integrate with [[CKTester/Users Guide|CKTester]].&lt;br /&gt;
&lt;br /&gt;
== Cell Config&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
In order to have the cell been indentified as a manual testing case, the [[CKTester/Users Guide#Tags|tag]]''''manual'''' is required.&lt;br /&gt;
&lt;br /&gt;
== Script Authoring  ==&lt;br /&gt;
&lt;br /&gt;
You could write the manual testing procedures( scripts ) in your preferred language, currently the following language are supported: &lt;br /&gt;
&lt;br /&gt;
=== Trac Wiki  ===&lt;br /&gt;
&lt;br /&gt;
Write the scripts inside a &amp;amp;lt;pre&amp;amp;gt; tag at the beginning of doc body indicate the '''TracWiki format''' is under use: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;pre&amp;amp;gt;&lt;br /&gt;
=== TC 1 ===&lt;br /&gt;
 1. Step1;&lt;br /&gt;
 1. Step2;&lt;br /&gt;
 1. Step3;&lt;br /&gt;
 * Expected Result: The output codes of editor should be:&lt;br /&gt;
{{{&lt;br /&gt;
   Output data...&lt;br /&gt;
}}}&lt;br /&gt;
 * Actual Result: JavaScript error thrown.&lt;br /&gt;
&amp;amp;lt;/pre&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== HTML  ===&lt;br /&gt;
&lt;br /&gt;
Write the scripts inside a &amp;amp;lt;div&amp;amp;gt; tag at the beginning of doc body indicate the '''HTML''' is under use: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;div&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;ol&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step1;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step2;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step3;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;/ol&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Expected Result: The output codes of editor should be:&lt;br /&gt;
			&amp;amp;lt;pre&amp;amp;gt;&lt;br /&gt;
				Output data...&lt;br /&gt;
			&amp;amp;lt;/pre&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Actual Result: JavaScript error thrown.&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/div&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
=== Test Decision  ===&lt;br /&gt;
&lt;br /&gt;
The most important step is to give a judgment to the test's final result after reproducing the procedures. A ''''PASS'''' button along with a &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;'&amp;lt;/span&amp;gt;'''FAIL'''' button are provided to achieve this, once the decision is made, the cell will be closed and result are report to the [[http://docs.fckeditor.net/CKTester/Users_Guide#Fort|fort]].&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/ManualTestRunner&amp;diff=2696</id>
		<title>CKTester/ManualTestRunner</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/ManualTestRunner&amp;diff=2696"/>
				<updated>2009-09-25T09:27:55Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
The '''manual testing runner''' is one type of our internal runners which dedicate to functional testing that are impossible to deliver with automation. It's designed to help developers/reports authoring and viewing manual testing scripts with ease, and with the ability to seamlessly integrate with CKTester. &lt;br /&gt;
&lt;br /&gt;
== Cell Config&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
In order to have the cell been indentified as a manual testing case, the tag ''''manual'''' is required. ( [[CKTester/Users_Guide#Tags|What's a tag?]] )&lt;br /&gt;
&lt;br /&gt;
== Script Authoring  ==&lt;br /&gt;
&lt;br /&gt;
You could write the manual testing procedures( scripts ) in your preferred language, currently the following language are supported: &lt;br /&gt;
&lt;br /&gt;
=== Trac Wiki  ===&lt;br /&gt;
&lt;br /&gt;
Write the scripts inside a &amp;amp;lt;pre&amp;amp;gt; tag at the beginning of doc body indicate the '''TracWiki format''' is under use: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;pre&amp;amp;gt;&lt;br /&gt;
=== TC 1 ===&lt;br /&gt;
 1. Step1;&lt;br /&gt;
 1. Step2;&lt;br /&gt;
 1. Step3;&lt;br /&gt;
 * Expected Result: The output codes of editor should be:&lt;br /&gt;
{{{&lt;br /&gt;
   Output data...&lt;br /&gt;
}}}&lt;br /&gt;
 * Actual Result: JavaScript error thrown.&lt;br /&gt;
&amp;amp;lt;/pre&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== HTML  ===&lt;br /&gt;
&lt;br /&gt;
Write the scripts inside a &amp;amp;lt;div&amp;amp;gt; tag at the beginning of doc body indicate the '''HTML''' is under use: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;div&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;ol&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step1;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step2;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step3;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;/ol&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Expected Result: The output codes of editor should be:&lt;br /&gt;
			&amp;amp;lt;pre&amp;amp;gt;&lt;br /&gt;
				Output data...&lt;br /&gt;
			&amp;amp;lt;/pre&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Actual Result: JavaScript error thrown.&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/div&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
=== Test Decision  ===&lt;br /&gt;
&lt;br /&gt;
The most important step is to give a judgment to the test's final result after reproducing the procedures. A ''''PASS'''' button along with a &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;'&amp;lt;/span&amp;gt;'''FAIL'''' button are provided to achieve this.&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/ManualTestRunner&amp;diff=2695</id>
		<title>CKTester/ManualTestRunner</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/ManualTestRunner&amp;diff=2695"/>
				<updated>2009-09-25T09:22:22Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
The manual testing runner is one type of our internal runners which dedicate to functional testing that are impossible to deliver with automation. It's designed to help developers/reports authoring and viewing manual testing scripts with ease, and with the ability to seamlessly integrate with CKTester. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Script Authoring  ==&lt;br /&gt;
&lt;br /&gt;
You could write the manual testing procedures( scripts ) in your preferred language, currently the following language are supported: &lt;br /&gt;
&lt;br /&gt;
=== Trac Wiki  ===&lt;br /&gt;
&lt;br /&gt;
Write the scripts inside a &amp;amp;lt;pre&amp;amp;gt; tag at the beginning of doc body indicate the '''TracWiki format''' is under use: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;pre&amp;amp;gt;&lt;br /&gt;
=== TC 1 ===&lt;br /&gt;
 1. Step1;&lt;br /&gt;
 1. Step2;&lt;br /&gt;
 1. Step3;&lt;br /&gt;
 * Expected Result: The output codes of editor should be:&lt;br /&gt;
{{{&lt;br /&gt;
   Output data...&lt;br /&gt;
}}}&lt;br /&gt;
 * Actual Result: JavaScript error thrown.&lt;br /&gt;
&amp;amp;lt;/pre&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== HTML  ===&lt;br /&gt;
&lt;br /&gt;
Write the scripts inside a &amp;amp;lt;div&amp;amp;gt; tag at the beginning of doc body indicate the '''HTML''' is under use: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;div&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;ol&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step1;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step2;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Step3;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;/ol&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Expected Result: The output codes of editor should be:&lt;br /&gt;
			&amp;amp;lt;pre&amp;amp;gt;&lt;br /&gt;
				Output data...&lt;br /&gt;
			&amp;amp;lt;/pre&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
		&amp;amp;lt;li&amp;amp;gt;Actual Result: JavaScript error thrown.&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
	&amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/div&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
=== Test Decision  ===&lt;br /&gt;
&lt;br /&gt;
The most important step is to give a judgment to the test's final result after reproducing the procedures. A ''''PASS'''' button along with a &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;'&amp;lt;/span&amp;gt;'''FAIL'''' button are provided to achieve this.&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/ManualTestRunner&amp;diff=2694</id>
		<title>CKTester/ManualTestRunner</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/ManualTestRunner&amp;diff=2694"/>
				<updated>2009-09-25T09:04:02Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: New page: == Overview  ==  The manual testing runner is one type of our internal runners which dedicate to functional testing that are impossible to deliver with automation. It's designed to help de...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
The manual testing runner is one type of our internal runners which dedicate to functional testing that are impossible to deliver with automation. It's designed to help developers/reports authoring and viewing manual testing scripts with ease, and with the ability to seamlessly integrate with CKTester. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Script Authoring  ==&lt;br /&gt;
&lt;br /&gt;
You could write the manual testing procedures( scripts ) in your preferred language, currently the following language are supported: &lt;br /&gt;
&lt;br /&gt;
=== Trac Wiki ===&lt;br /&gt;
&lt;br /&gt;
Write the scripts inside a &amp;amp;lt;pre&amp;amp;gt; tag at the beginning of doc body indicate the Trac Wiki is under use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
HTML&lt;br /&gt;
&lt;br /&gt;
Write the scripts inside a &amp;amp;lt;div&amp;amp;gt; tag at the beginning of doc body indicate the HTML is under use: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2693</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2693"/>
				<updated>2009-09-24T09:25:36Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser&amp;amp;nbsp;: locally, on a web server or via secure connections. &lt;br /&gt;
&lt;br /&gt;
== How It Works  ==&lt;br /&gt;
It would be easy to understand how the system works by looking at each of the following components which constitute it.&lt;br /&gt;
&lt;br /&gt;
=== Test Cell  ===&lt;br /&gt;
&lt;br /&gt;
A '''test cell''' is the basic unit of a project's testing, a plain HTML file reside in individual project's testing sources, in which test suites/cases are written. It will be loaded and executed inside an iframe or popup window depends on the running of choice, so '''full page life cycle''' ( from page load to page destroy ) is guaranteed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each cell has one key responsibility of '''reporting''' the sucess/failure/time of it's execution to the fort, this is done by cross-frame communication with parent/opener window. For this, the cell is required to include a bootstrap file: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;{CKTester_ROOT}/bootstrap.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The cell's entire testing environment, including testing target, runtime libraries, etc. will mostly be injected by the fort, which are declared by a meta tag of the HTML file. This inversion of control feature (IoC) make the cell testing framework neutral.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;// I'm a unit test for the editor(CKEditor) and the TCs within me are stable( been finalized ). &lt;br /&gt;
&amp;amp;lt;meta name=&amp;quot;tags&amp;quot; content=&amp;quot;editor,unit,stable&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Profile  ===&lt;br /&gt;
&lt;br /&gt;
A '''testing profile''' is a JavaScript configuration file which specify how a project is to be tested by CKTester. It contains a function which returns a configuration object including.&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#'''Cells list'''&amp;amp;nbsp;: A list of key/values which tells where are the cells and what are the tags of each cell.&amp;lt;br&amp;gt;Key&amp;amp;nbsp;: The test cell '''file path''', where all the paths are relative to the runner; &amp;lt;br&amp;gt;Value&amp;amp;nbsp;: An array of '''tags''' of that cell.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#'''Cell Resolvers&amp;amp;nbsp;''': An array of functions which were used to manipulate each cell's attributes, e.g. Inject necessary dependencies for cells which have certain tags. These are the complementary of the default resolvers that the '''fort '''already has.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file content will basically looks like: &lt;br /&gt;
&amp;lt;pre&amp;gt;CKTester.profile = function ()&lt;br /&gt;
{&lt;br /&gt;
	return&lt;br /&gt;
	{&lt;br /&gt;
		cells&amp;amp;nbsp;: [&lt;br /&gt;
			[ '/dt/unit/plugins/htmldataprocessor/1' ], 		// Implicit tag declaration( each sub path form a tag ).&lt;br /&gt;
			[ '/tt/1.html' , [ 'editor', 'unit', 'htmldataprocessor' ] ]  // Explicit tag declaration.&lt;br /&gt;
		]&lt;br /&gt;
		cellResolvers&amp;amp;nbsp;:&lt;br /&gt;
		[&lt;br /&gt;
			function( cell )&lt;br /&gt;
			{&lt;br /&gt;
				var tags = cell.tags, env = cell.environment;&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor source.&lt;br /&gt;
				if( ( tags.indexOf( 'editor' )&amp;amp;nbsp;!= -1 )&lt;br /&gt;
					&amp;amp;amp;&amp;amp;amp; ( tags.indexOf( 'editor-ondemand' ) == -1  ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_source.js' );&lt;br /&gt;
				else if ( tags.indexOf( 'editor-ondemand' ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_basic_source.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor unit test library.&lt;br /&gt;
				if ( tags.indexOf( 'unit' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/unit.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor manual test library.&lt;br /&gt;
				if ( tags.indexOf( 'manual' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/manual.js' );&lt;br /&gt;
			}&lt;br /&gt;
		]&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note''': the testing profile is recommanded to be generated automatically by the gen-profile tool script, though it could be altered manually.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Tags  ===&lt;br /&gt;
&lt;br /&gt;
'''Tag''' is playing an important role as the '''annotation '''of a cell with the following aspects: &lt;br /&gt;
&lt;br /&gt;
#Environments( dependencies ) of a cell, e.g. if the cell has tags 'unit' and 'editor', it denote it must be running under a unit test runner( e.g. YUITest ), and the testing target is CKEditor; &lt;br /&gt;
#Categories of the cell, useful to grouping similar cells. E.g. A cell with a path 'dt/core/dom/documentfragment' denote it's a design test for the core codes of dom module about document-fragment. &lt;br /&gt;
#Any other reasonable denotation.&lt;br /&gt;
&lt;br /&gt;
=== Fort  ===&lt;br /&gt;
&lt;br /&gt;
The '''Test Fort''' is a central hub for registering and running all the cells, which also consists of a UI to specifiy criterias and viewing report. &lt;br /&gt;
&lt;br /&gt;
The runner is driven by a specified profile( use the default one if not specified ), from which all cells are registering. Upon requesting by a specific testing criteria, it filtering down the registered cells to only execute the satisfied ones. &lt;br /&gt;
&lt;br /&gt;
During the loading of each cell before running, an extensible '''cell resolver''' will manipulate ( to figure out the required/requested resources of a specific cell ) the cell by analysing it's tags, guarantee the cell always has all the environment it should receive. These resources are typically composed of&amp;amp;nbsp;: &lt;br /&gt;
&lt;br /&gt;
*The testing target &lt;br /&gt;
*The testing library &lt;br /&gt;
*Any resources dedicated to the cell.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At last the cell will be running in one of these '''two modes''' depend on the user: &lt;br /&gt;
&lt;br /&gt;
#Managed Mode&amp;amp;nbsp;: It's the default mode when it's running in a batch of cells by the forge, where the cell is running in an iframe. &lt;br /&gt;
#Standalone Mode&amp;amp;nbsp;: When a cell is running separately, on the opposite of 'Managed Mode', the cell will be running inside a popup window, this is often used when it's a manual test case or detailed information about the TCs is required to be reviewed( e.g. which exactly test method failed in the TC? ).&lt;br /&gt;
&lt;br /&gt;
=== Testing Criteria  ===&lt;br /&gt;
&lt;br /&gt;
A criteria is simply a URL request to the fort, tells which cells to be run. &lt;br /&gt;
&lt;br /&gt;
#It could contains a path to a '''profile''' to be used. &lt;br /&gt;
#It could contains certain tags, so only with which the cells to be run. &lt;br /&gt;
#It could explicitly specify a single cell location along with certain tags.&lt;br /&gt;
&lt;br /&gt;
Some example criteria look like: &lt;br /&gt;
&lt;br /&gt;
*Running all cells defined in a specified profile file: http://ckeditor.t/cktester/fort.html?profile=../myprofile.js &lt;br /&gt;
*Running all the stable unit tests of the default profile: http://ckeditor.t/cktester/fort.html?cells=stable,unit &lt;br /&gt;
*Running a specific ticket test with tags 'editor','unit','all'&amp;amp;nbsp;: http://ckeditor.t/cktester/fort.html?cells=http://ckeditor.t/tt/4397/1.html&amp;amp;amp;tags=editor,unit,all&amp;lt;br&amp;gt;( '''Note''': It's a shortcut to achieved the same criteria by just open the url of that individual cell (http://ckeditor.t/tt/4397/1.html) and it will be redirected correctly back to the forge. )&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': Below we'll take the CKEditor project as an example to illustrate the install process. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; First of all, checking out these three component: the staging project, it's test suites and CKTester eventually. &lt;br /&gt;
&lt;br /&gt;
#Checkout CKEditor's testing branch from [http://svn.fckeditor.net/CKEditor/tests SVN] ( We name the working copy path as CKEDITOR_TEST_ROOT below ). &amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKEditor trunk( or any other version are subjected to test ) from [http://svn.fckeditor.net/CKEditor/trunk/ SVN] into a folder ( e.g. ckeditor ) under CKEDITOR_TEST_ROOT ( We name the working copy path as CKEDITOR_ROOT below ).&amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKTester from [http://svn.fckeditor.net/CKTester SVN]&amp;amp;nbsp;into a folder( e.g. cktester ) under CKEDITOR_TEST_ROOT( We name the working copy path as CKTESTER_ROOT below ).&lt;br /&gt;
&lt;br /&gt;
Open the file {CKTESTER_ROOT}/variables.js.tpl with modification to the following variables:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;	// Absolute path point to the root path of CKEditor project.&lt;br /&gt;
	'CKEDITOR_ROOT'&amp;amp;nbsp;: '/ckeditor',&lt;br /&gt;
&lt;br /&gt;
        // Point to the root path of CKEditor test branch.&lt;br /&gt;
          ( You don't need to alter it if your web server's serving root from CKEDITOR_TEST_ROOT.&lt;br /&gt;
       'CKEDITOR_TEST_BRANCH_ROOT'&amp;amp;nbsp;: '/'&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
At last, run the script {CKTESTER_ROOT}/_dev/gen-profile.bat(.sh) ( you'll need install [http://ant.apache.org/ Apache Ant and configure the ANT_HOME variable of your system ] ) which helps you to generate the testing profile automatically by scanning the resources within {CKEDITOR_TEST_ROOT}. After that, you should get a file created at {CKTESTER_ROOT}/profile.js.&lt;br /&gt;
&lt;br /&gt;
And it's done, now point your web browser at {CKEDITOR_TEST_ROOT}/index.html, there're already a few pilot links which help you to kick start.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': All the following tasks are assuming you already have CKTester properly installed.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Running a specific ticket test ===&lt;br /&gt;
&lt;br /&gt;
It's quite a frequent usecase when you're working on a particular ticket and quite straight forward that you can just point the browser to the location of that ticket test cell(e.g. [http://ckeditor.t/tt/4385/1.html http://ckeditor.t/tt/4385/1.html]), CKTester will redirect you to the fort as single cell criteria.&lt;br /&gt;
&lt;br /&gt;
== History  ==&lt;br /&gt;
&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2692</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2692"/>
				<updated>2009-09-24T09:18:15Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser&amp;amp;nbsp;: locally, on a web server or via secure connections. &lt;br /&gt;
&lt;br /&gt;
== How It Works  ==&lt;br /&gt;
&lt;br /&gt;
=== Test Cell  ===&lt;br /&gt;
&lt;br /&gt;
A '''test cell''' is the basic unit of a project's testing, a plain HTML file reside in individual project's testing sources, in which test suites/cases are written. It will be loaded and executed inside an iframe or popup window depends on the running of choice, so '''full page life cycle''' ( from page load to page destroy ) is guaranteed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each cell has one key responsibility of '''reporting''' the sucess/failure/time of it's execution to the fort, this is done by cross-frame communication with parent/opener window. For this, the cell is required to include a bootstrap file: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;{CKTester_ROOT}/bootstrap.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The cell's entire testing environment, including testing target, runtime libraries, etc. will mostly be injected by the fort, which are declared by a meta tag of the HTML file. This inversion of control feature (IoC) make the cell testing framework neutral.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;// I'm a unit test for the editor(CKEditor) and the TCs within me are stable( been finalized ). &lt;br /&gt;
&amp;amp;lt;meta name=&amp;quot;tags&amp;quot; content=&amp;quot;editor,unit,stable&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Profile  ===&lt;br /&gt;
&lt;br /&gt;
A '''testing profile''' is a JavaScript configuration file which specify how a project is to be tested by CKTester. It contains a function which returns a configuration object including.&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#'''Cells list'''&amp;amp;nbsp;: A list of key/values which tells where are the cells and what are the tags of each cell.&amp;lt;br&amp;gt;Key&amp;amp;nbsp;: The test cell '''file path''', where all the paths are relative to the runner; &amp;lt;br&amp;gt;Value&amp;amp;nbsp;: An array of '''tags''' of that cell.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#'''Cell Resolvers&amp;amp;nbsp;''': An array of functions which were used to manipulate each cell's attributes, e.g. Inject necessary dependencies for cells which have certain tags. These are the complementary of the default resolvers that the '''fort '''already has.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file content will basically looks like: &lt;br /&gt;
&amp;lt;pre&amp;gt;CKTester.profile = function ()&lt;br /&gt;
{&lt;br /&gt;
	return&lt;br /&gt;
	{&lt;br /&gt;
		cells&amp;amp;nbsp;: [&lt;br /&gt;
			[ '/dt/unit/plugins/htmldataprocessor/1' ], 		// Implicit tag declaration( each sub path form a tag ).&lt;br /&gt;
			[ '/tt/1.html' , [ 'editor', 'unit', 'htmldataprocessor' ] ]  // Explicit tag declaration.&lt;br /&gt;
		]&lt;br /&gt;
		cellResolvers&amp;amp;nbsp;:&lt;br /&gt;
		[&lt;br /&gt;
			function( cell )&lt;br /&gt;
			{&lt;br /&gt;
				var tags = cell.tags, env = cell.environment;&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor source.&lt;br /&gt;
				if( ( tags.indexOf( 'editor' )&amp;amp;nbsp;!= -1 )&lt;br /&gt;
					&amp;amp;amp;&amp;amp;amp; ( tags.indexOf( 'editor-ondemand' ) == -1  ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_source.js' );&lt;br /&gt;
				else if ( tags.indexOf( 'editor-ondemand' ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_basic_source.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor unit test library.&lt;br /&gt;
				if ( tags.indexOf( 'unit' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/unit.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor manual test library.&lt;br /&gt;
				if ( tags.indexOf( 'manual' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/manual.js' );&lt;br /&gt;
			}&lt;br /&gt;
		]&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note''': the testing profile is recommanded to be generated automatically by the gen-profile tool script, though it could be altered manually.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Tags  ===&lt;br /&gt;
&lt;br /&gt;
'''Tag''' is playing an important role as the '''annotation '''of a cell with the following aspects: &lt;br /&gt;
&lt;br /&gt;
#Environments( dependencies ) of a cell, e.g. if the cell has tags 'unit' and 'editor', it denote it must be running under a unit test runner( e.g. YUITest ), and the testing target is CKEditor; &lt;br /&gt;
#Categories of the cell, useful to grouping similar cells. E.g. A cell with a path 'dt/core/dom/documentfragment' denote it's a design test for the core codes of dom module about document-fragment. &lt;br /&gt;
#Any other reasonable denotation.&lt;br /&gt;
&lt;br /&gt;
=== Fort  ===&lt;br /&gt;
&lt;br /&gt;
The '''Test Fort''' is a central hub for registering and running all the cells, which also consists of a UI to specifiy criterias and viewing report. &lt;br /&gt;
&lt;br /&gt;
The runner is driven by a specified profile( use the default one if not specified ), from which all cells are registering. Upon requesting by a specific testing criteria, it filtering down the registered cells to only execute the satisfied ones. &lt;br /&gt;
&lt;br /&gt;
During the loading of each cell before running, an extensible '''cell resolver''' will manipulate ( to figure out the required/requested resources of a specific cell ) the cell by analysing it's tags, guarantee the cell always has all the environment it should receive. These resources are typically composed of&amp;amp;nbsp;: &lt;br /&gt;
&lt;br /&gt;
*The testing target &lt;br /&gt;
*The testing library &lt;br /&gt;
*Any resources dedicated to the cell.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At last the cell will be running in one of these '''two modes''' depend on the user: &lt;br /&gt;
&lt;br /&gt;
#Managed Mode&amp;amp;nbsp;: It's the default mode when it's running in a batch of cells by the forge, where the cell is running in an iframe. &lt;br /&gt;
#Standalone Mode&amp;amp;nbsp;: When a cell is running separately, on the opposite of 'Managed Mode', the cell will be running inside a popup window, this is often used when it's a manual test case or detailed information about the TCs is required to be reviewed( e.g. which exactly test method failed in the TC? ).&lt;br /&gt;
&lt;br /&gt;
=== Testing Criteria  ===&lt;br /&gt;
&lt;br /&gt;
A criteria is simply a URL request to the fort, tells which cells to be run. &lt;br /&gt;
&lt;br /&gt;
#It could contains a path to a '''profile''' to be used. &lt;br /&gt;
#It could contains certain tags, so only with which the cells to be run. &lt;br /&gt;
#It could explicitly specify a single cell location along with certain tags.&lt;br /&gt;
&lt;br /&gt;
Some example criteria look like: &lt;br /&gt;
&lt;br /&gt;
*Running all cells defined in a specified profile file: http://ckeditor.t/cktester/fort.html?profile=../myprofile.js &lt;br /&gt;
*Running all the stable unit tests of the default profile: http://ckeditor.t/cktester/fort.html?cells=stable,unit &lt;br /&gt;
*Running a specific ticket test with tags 'editor','unit','all'&amp;amp;nbsp;: http://ckeditor.t/cktester/fort.html?cells=http://ckeditor.t/tt/4397/1.html&amp;amp;amp;tags=editor,unit,all&amp;lt;br&amp;gt;( '''Note''': It's a shortcut to achieved the same criteria by just open the url of that individual cell (http://ckeditor.t/tt/4397/1.html) and it will be redirected correctly back to the forge. )&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': Below we'll take the CKEditor project as an example to illustrate the install process. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; First of all, checking out these three component: the staging project, it's test suites and CKTester eventually. &lt;br /&gt;
&lt;br /&gt;
#Checkout CKEditor's testing branch from [http://svn.fckeditor.net/CKEditor/tests SVN] ( We name the working copy path as CKEDITOR_TEST_ROOT below ). &amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKEditor trunk( or any other version are subjected to test ) from [http://svn.fckeditor.net/CKEditor/trunk/ SVN] into a folder ( e.g. ckeditor ) under CKEDITOR_TEST_ROOT ( We name the working copy path as CKEDITOR_ROOT below ).&amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKTester from [http://svn.fckeditor.net/CKTester SVN]&amp;amp;nbsp;into a folder( e.g. cktester ) under CKEDITOR_TEST_ROOT( We name the working copy path as CKTESTER_ROOT below ).&lt;br /&gt;
&lt;br /&gt;
Open the file {CKTESTER_ROOT}/variables.js.tpl with modification to the following variables:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;	// Absolute path point to the root path of CKEditor project.&lt;br /&gt;
	'CKEDITOR_ROOT'&amp;amp;nbsp;: '/ckeditor',&lt;br /&gt;
&lt;br /&gt;
        // Point to the root path of CKEditor test branch.&lt;br /&gt;
          ( You don't need to alter it if your web server's serving root from CKEDITOR_TEST_ROOT.&lt;br /&gt;
       'CKEDITOR_TEST_BRANCH_ROOT'&amp;amp;nbsp;: '/'&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
At last, run the script {CKTESTER_ROOT}/_dev/gen-profile.bat(.sh) ( you'll need install [http://ant.apache.org/ Apache Ant and configure the ANT_HOME variable of your system ] ) which helps you to generate the testing profile automatically by scanning the resources within {CKEDITOR_TEST_ROOT}. After that, you should get a file created at {CKTESTER_ROOT}/profile.js.&lt;br /&gt;
&lt;br /&gt;
And it's done, now point your web browser at {CKEDITOR_TEST_ROOT}/index.html, there're already a few pilot links which help you to kick start.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': All the following tasks are assuming you already have CKTester properly installed.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Running a specific ticket test&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
It's quite a frequent usecase when you're working on a particular ticket and quite straight forward that you can just point the browser to the location of that ticket test cell(e.g. [http://ckeditor.t/tt/4385/1.html http://ckeditor.t/tt/4385/1.html]), CKTester will redirect you to the fort as single cell criterial.&lt;br /&gt;
&lt;br /&gt;
== History  ==&lt;br /&gt;
&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2691</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2691"/>
				<updated>2009-09-24T09:14:47Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser&amp;amp;nbsp;: locally, on a web server or via secure connections. &lt;br /&gt;
&lt;br /&gt;
== How It Works  ==&lt;br /&gt;
&lt;br /&gt;
=== Test Cell  ===&lt;br /&gt;
&lt;br /&gt;
A '''test cell''' is the basic unit of a project's testing, a plain HTML file reside in individual project's testing sources, in which test suites/cases are written. It will be loaded and executed inside an iframe or popup window depends on the running of choice, so '''full page life cycle''' ( from page load to page destroy ) is guaranteed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each cell has one key responsibility of '''reporting''' the sucess/failure/time of it's execution to the fort, this is done by cross-frame communication with parent/opener window. For this, the cell is required to include a bootstrap file: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;{CKTester_ROOT}/bootstrap.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The cell's entire testing environment, including testing target, runtime libraries, etc. will mostly be injected by the fort, which are declared by a meta tag of the HTML file. This inversion of control feature (IoC) make the cell testing framework neutral.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;// I'm a unit test for the editor(CKEditor) and the TCs within me are stable( been finalized ). &lt;br /&gt;
&amp;amp;lt;meta name=&amp;quot;tags&amp;quot; content=&amp;quot;editor,unit,stable&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Profile  ===&lt;br /&gt;
&lt;br /&gt;
A '''testing profile''' is a JavaScript configuration file which specify how a project is to be tested by CKTester. It contains a function which returns a configuration object including.&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#'''Cells list'''&amp;amp;nbsp;: A list of key/values which tells where are the cells and what are the tags of each cell.&amp;lt;br&amp;gt;Key&amp;amp;nbsp;: The test cell '''file path''', where all the paths are relative to the runner; &amp;lt;br&amp;gt;Value&amp;amp;nbsp;: An array of '''tags''' of that cell.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#'''Cell Resolvers&amp;amp;nbsp;''': An array of functions which were used to manipulate each cell's attributes, e.g. Inject necessary dependencies for cells which have certain tags. These are the complementary of the default resolvers that the '''fort '''already has.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file content will basically looks like: &lt;br /&gt;
&amp;lt;pre&amp;gt;CKTester.profile = function ()&lt;br /&gt;
{&lt;br /&gt;
	return&lt;br /&gt;
	{&lt;br /&gt;
		cells&amp;amp;nbsp;: [&lt;br /&gt;
			[ '/dt/unit/plugins/htmldataprocessor/1' ], 		// Implicit tag declaration( each sub path form a tag ).&lt;br /&gt;
			[ '/tt/1.html' , [ 'editor', 'unit', 'htmldataprocessor' ] ]  // Explicit tag declaration.&lt;br /&gt;
		]&lt;br /&gt;
		cellResolvers&amp;amp;nbsp;:&lt;br /&gt;
		[&lt;br /&gt;
			function( cell )&lt;br /&gt;
			{&lt;br /&gt;
				var tags = cell.tags, env = cell.environment;&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor source.&lt;br /&gt;
				if( ( tags.indexOf( 'editor' )&amp;amp;nbsp;!= -1 )&lt;br /&gt;
					&amp;amp;amp;&amp;amp;amp; ( tags.indexOf( 'editor-ondemand' ) == -1  ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_source.js' );&lt;br /&gt;
				else if ( tags.indexOf( 'editor-ondemand' ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_basic_source.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor unit test library.&lt;br /&gt;
				if ( tags.indexOf( 'unit' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/unit.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor manual test library.&lt;br /&gt;
				if ( tags.indexOf( 'manual' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/manual.js' );&lt;br /&gt;
			}&lt;br /&gt;
		]&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note''': the testing profile is recommanded to be generated automatically by the gen-profile tool script, though it could be altered manually.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Tags  ===&lt;br /&gt;
&lt;br /&gt;
'''Tag''' is playing an important role as the '''annotation '''of a cell with the following aspects: &lt;br /&gt;
&lt;br /&gt;
#Environments( dependencies ) of a cell, e.g. if the cell has tags 'unit' and 'editor', it denote it must be running under a unit test runner( e.g. YUITest ), and the testing target is CKEditor; &lt;br /&gt;
#Categories of the cell, useful to grouping similar cells. E.g. A cell with a path 'dt/core/dom/documentfragment' denote it's a design test for the core codes of dom module about document-fragment. &lt;br /&gt;
#Any other reasonable denotation.&lt;br /&gt;
&lt;br /&gt;
=== Fort  ===&lt;br /&gt;
&lt;br /&gt;
The '''Test Fort''' is a central hub for registering and running all the cells, which also consists of a UI to specifiy criterias and viewing report. &lt;br /&gt;
&lt;br /&gt;
The runner is driven by a specified profile( use the default one if not specified ), from which all cells are registering. Upon requesting by a specific testing criteria, it filtering down the registered cells to only execute the satisfied ones. &lt;br /&gt;
&lt;br /&gt;
During the loading of each cell before running, an extensible '''cell resolver''' will manipulate ( to figure out the required/requested resources of a specific cell ) the cell by analysing it's tags, guarantee the cell always has all the environment it should receive. These resources are typically composed of&amp;amp;nbsp;: &lt;br /&gt;
&lt;br /&gt;
*The testing target &lt;br /&gt;
*The testing library &lt;br /&gt;
*Any resources dedicated to the cell.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At last the cell will be running in one of these '''two modes''' depend on the user: &lt;br /&gt;
&lt;br /&gt;
#Managed Mode&amp;amp;nbsp;: It's the default mode when it's running in a batch of cells by the forge, where the cell is running in an iframe. &lt;br /&gt;
#Standalone Mode&amp;amp;nbsp;: When a cell is running separately, on the opposite of 'Managed Mode', the cell will be running inside a popup window, this is often used when it's a manual test case or detailed information about the TCs is required to be reviewed( e.g. which exactly test method failed in the TC? ).&lt;br /&gt;
&lt;br /&gt;
=== Testing Criteria  ===&lt;br /&gt;
&lt;br /&gt;
A criteria is simply a URL request to the fort, tells which cells to be run. &lt;br /&gt;
&lt;br /&gt;
#It could contains a path to a '''profile''' to be used. &lt;br /&gt;
#It could contains certain tags, so only with which the cells to be run. &lt;br /&gt;
#It could explicitly specify a single cell location along with certain tags.&lt;br /&gt;
&lt;br /&gt;
Some example criteria look like: &lt;br /&gt;
&lt;br /&gt;
*Running all cells defined in a specified profile file: http://ckeditor.t/cktester/fort.html?profile=../myprofile.js &lt;br /&gt;
*Running all the stable unit tests of the default profile: http://ckeditor.t/cktester/fort.html?cells=stable,unit &lt;br /&gt;
*Running a specific ticket test with tags 'editor','unit','all'&amp;amp;nbsp;: http://ckeditor.t/cktester/fort.html?cells=http://ckeditor.t/tt/4397/1.html&amp;amp;amp;tags=editor,unit,all&amp;lt;br&amp;gt;( '''Note''': It's a shortcut to achieved the same criteria by just open the url of that individual cell (http://ckeditor.t/tt/4397/1.html) and it will be redirected correctly back to the forge. )&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': Below we'll take the CKEditor project as an example to illustrate the install process. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; First of all, checking out these three component: the staging project, it's test suites and CKTester eventually. &lt;br /&gt;
&lt;br /&gt;
#Checkout CKEditor's testing branch from [http://svn.fckeditor.net/CKEditor/tests SVN] ( We name the working copy path as CKEDITOR_TEST_ROOT below ). &amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKEditor trunk( or any other version are subjected to test ) from [http://svn.fckeditor.net/CKEditor/trunk/ SVN] into a folder ( e.g. ckeditor ) under CKEDITOR_TEST_ROOT ( We name the working copy path as CKEDITOR_ROOT below ).&amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKTester from [http://svn.fckeditor.net/CKTester SVN]&amp;amp;nbsp;into a folder( e.g. cktester ) under CKEDITOR_TEST_ROOT( We name the working copy path as CKTESTER_ROOT below ).&lt;br /&gt;
&lt;br /&gt;
Open the file {CKTESTER_ROOT}/variables.js.tpl with modification to the following variables:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;	// Absolute path point to the root path of CKEditor project.&lt;br /&gt;
	'CKEDITOR_ROOT'&amp;amp;nbsp;: '/ckeditor',&lt;br /&gt;
&lt;br /&gt;
        // Point to the root path of CKEditor test branch.&lt;br /&gt;
          ( You don't need to alter it if your web server's serving root from CKEDITOR_TEST_ROOT.&lt;br /&gt;
       'CKEDITOR_TEST_BRANCH_ROOT'&amp;amp;nbsp;: '/'&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
At last, run the script {CKTESTER_ROOT}/_dev/gen-profile.bat(.sh) ( you'll need install [http://ant.apache.org/ Apache Ant] ) which helps you to generate the testing profile automatically by scanning the resources within {CKEDITOR_TEST_ROOT}. After that, you'll get a file created at {CKTESTER_ROOT}/template.js which looks basically like: &lt;br /&gt;
&amp;lt;pre&amp;gt;	CKTESTER.fort.getProfile = function ()&lt;br /&gt;
	{&lt;br /&gt;
		return {&lt;br /&gt;
			cells&amp;amp;nbsp;:&lt;br /&gt;
			[&lt;br /&gt;
			// Generated cell paths...&lt;br /&gt;
			],&lt;br /&gt;
			cellResolvers&amp;amp;nbsp;:&lt;br /&gt;
			[&lt;br /&gt;
			// Some Default cell resolvers. &lt;br /&gt;
			]&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
It's done, now point your web browser at {CKEDITOR_TEST_ROOT}/index.html, a few pilot links there to kick start you testing.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': All the following tasks are assuming you already have CKTester properly installed.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Running a specific ticket test&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
It's quite a frequent usecase when you're working on a particular ticket and quite straight forward that you can just point the browser to the location of that ticket test cell(e.g. [http://ckeditor.t/tt/4385/1.html http://ckeditor.t/tt/4385/1.html]), CKTester will redirect you to the fort as single cell criterial.&lt;br /&gt;
&lt;br /&gt;
== History  ==&lt;br /&gt;
&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2690</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2690"/>
				<updated>2009-09-24T09:04:58Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser&amp;amp;nbsp;: locally, on a web server or via secure connections. &lt;br /&gt;
&lt;br /&gt;
== How It Works  ==&lt;br /&gt;
&lt;br /&gt;
=== Test Cell  ===&lt;br /&gt;
&lt;br /&gt;
A '''test cell''' is the basic unit of a project's testing, a plain HTML file reside in individual project's testing sources, in which test suites/cases are written. It will be loaded and executed inside an iframe or popup window depends on the running of choice, so '''full page life cycle''' ( from page load to page destroy ) is guaranteed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each cell has one key responsibility of '''reporting''' the sucess/failure/time of it's execution to the fort, this is done by cross-frame communication with parent/opener window. For this, the cell is required to include a bootstrap file: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;{CKTester_ROOT}/bootstrap.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The cell's entire testing environment, including testing target, runtime libraries, etc. will mostly be injected by the fort, which are declared by a meta tag of the HTML file. This inversion of control feature (IoC) make the cell testing framework neutral.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;// I'm a unit test for the editor(CKEditor) and the TCs within me are stable( been finalized ). &lt;br /&gt;
&amp;amp;lt;meta name=&amp;quot;tags&amp;quot; content=&amp;quot;editor,unit,stable&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Profile  ===&lt;br /&gt;
&lt;br /&gt;
A '''testing profile''' is a JavaScript configuration file which specify how a project is to be tested by CKTester. It contains a function which returns a configuration object including.&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#'''Cells list'''&amp;amp;nbsp;: A list of key/values which tells where are the cells and what are the tags of each cell.&amp;lt;br&amp;gt;Key&amp;amp;nbsp;: The test cell '''file path''', where all the paths are relative to the runner; &amp;lt;br&amp;gt;Value&amp;amp;nbsp;: An array of '''tags''' of that cell.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#'''Cell Resolvers&amp;amp;nbsp;''': An array of functions which were used to manipulate each cell's attributes, e.g. Inject necessary dependencies for cells which have certain tags. These are the complementary of the default resolvers that the '''fort '''already has.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file content will basically looks like: &lt;br /&gt;
&amp;lt;pre&amp;gt;CKTester.profile = function ()&lt;br /&gt;
{&lt;br /&gt;
	return&lt;br /&gt;
	{&lt;br /&gt;
		cells&amp;amp;nbsp;: [&lt;br /&gt;
			[ '/dt/unit/plugins/htmldataprocessor/1' ], 		// Implicit tag declaration( each sub path form a tag ).&lt;br /&gt;
			[ '/tt/1.html' , [ 'editor', 'unit', 'htmldataprocessor' ] ]  // Explicit tag declaration.&lt;br /&gt;
		]&lt;br /&gt;
		cellResolvers&amp;amp;nbsp;:&lt;br /&gt;
		[&lt;br /&gt;
			function( cell )&lt;br /&gt;
			{&lt;br /&gt;
				var tags = cell.tags, env = cell.environment;&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor source.&lt;br /&gt;
				if( ( tags.indexOf( 'editor' )&amp;amp;nbsp;!= -1 )&lt;br /&gt;
					&amp;amp;amp;&amp;amp;amp; ( tags.indexOf( 'editor-ondemand' ) == -1  ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_source.js' );&lt;br /&gt;
				else if ( tags.indexOf( 'editor-ondemand' ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_basic_source.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor unit test library.&lt;br /&gt;
				if ( tags.indexOf( 'unit' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/unit.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor manual test library.&lt;br /&gt;
				if ( tags.indexOf( 'manual' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/manual.js' );&lt;br /&gt;
			}&lt;br /&gt;
		]&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note''': the testing profile is recommanded to be generated automatically by the gen-profile tool script, though it could be altered manually.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Tags  ===&lt;br /&gt;
&lt;br /&gt;
'''Tag''' is playing an important role as the '''annotation '''of a cell with the following aspects: &lt;br /&gt;
&lt;br /&gt;
#Environments( dependencies ) of a cell, e.g. if the cell has tags 'unit' and 'editor', it denote it must be running under a unit test runner( e.g. YUITest ), and the testing target is CKEditor; &lt;br /&gt;
#Categories of the cell, useful to grouping similar cells. E.g. A cell with a path 'dt/core/dom/documentfragment' denote it's a design test for the core codes of dom module about document-fragment. &lt;br /&gt;
#Any other reasonable denotation.&lt;br /&gt;
&lt;br /&gt;
=== Fort  ===&lt;br /&gt;
&lt;br /&gt;
The '''Test Fort''' is a central hub for registering and running all the cells, which also consists of a UI to specifiy criterias and viewing report. &lt;br /&gt;
&lt;br /&gt;
The runner is driven by a specified profile( use the default one if not specified ), from which all cells are registering. Upon requesting by a specific testing criteria, it filtering down the registered cells to only execute the satisfied ones. &lt;br /&gt;
&lt;br /&gt;
During the loading of each cell before running, an extensible '''cell resolver''' will manipulate ( to figure out the required/requested resources of a specific cell ) the cell by analysing it's tags, guarantee the cell always has all the environment it should receive. These resources are typically composed of&amp;amp;nbsp;: &lt;br /&gt;
&lt;br /&gt;
*The testing target &lt;br /&gt;
*The testing library &lt;br /&gt;
*Any resources dedicated to the cell.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At last the cell will be running in one of these '''two modes''' depend on the user: &lt;br /&gt;
&lt;br /&gt;
#Managed Mode&amp;amp;nbsp;: It's the default mode when it's running in a batch of cells by the forge, where the cell is running in an iframe. &lt;br /&gt;
#Standalone Mode&amp;amp;nbsp;: When a cell is running separately, on the opposite of 'Managed Mode', the cell will be running inside a popup window, this is often used when it's a manual test case or detailed information about the TCs is required to be reviewed( e.g. which exactly test method failed in the TC? ).&lt;br /&gt;
&lt;br /&gt;
=== Testing Criteria  ===&lt;br /&gt;
&lt;br /&gt;
A criteria is simply a URL request to the fort, tells which cells to be run. &lt;br /&gt;
&lt;br /&gt;
#It could contains a path to a '''profile''' to be used. &lt;br /&gt;
#It could contains certain tags, so only with which the cells to be run. &lt;br /&gt;
#It could explicitly specify a single cell location along with certain tags.&lt;br /&gt;
&lt;br /&gt;
Some example criteria look like: &lt;br /&gt;
&lt;br /&gt;
*Running all cells defined in a specified profile file: http://ckeditor.t/cktester/fort.html?profile=../myprofile.js &lt;br /&gt;
*Running all the stable unit tests of the default profile: http://ckeditor.t/cktester/fort.html?cells=stable,unit &lt;br /&gt;
*Running a specific ticket test with tags 'editor','unit','all'&amp;amp;nbsp;: http://ckeditor.t/cktester/fort.html?cells=http://ckeditor.t/tt/4397/1.html&amp;amp;amp;tags=editor,unit,all&amp;lt;br&amp;gt;( '''Note''': It's a shortcut to achieved the same criteria by just open the url of that individual cell (http://ckeditor.t/tt/4397/1.html) and it will be redirected correctly back to the forge. )&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': Below we'll take the CKEditor project as an example to illustrate the install process. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; First of all, checking out these three component: the staging project, it's test suites and CKTester eventually. &lt;br /&gt;
&lt;br /&gt;
#Checkout CKEditor's testing branch from [http://svn.fckeditor.net/CKEditor/tests SVN] ( We name the working copy path as CKEDITOR_TEST_ROOT below ). &amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKEditor trunk( or any other version are subjected to test ) from [http://svn.fckeditor.net/CKEditor/trunk/ SVN] into a folder ( e.g. ckeditor ) under CKEDITOR_TEST_ROOT ( We name the working copy path as CKEDITOR_ROOT below ).&amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKTester from [http://svn.fckeditor.net/CKTester SVN]&amp;amp;nbsp;into a folder( e.g. cktester ) under CKEDITOR_TEST_ROOT( We name the working copy path as CKTESTER_ROOT below ).&lt;br /&gt;
&lt;br /&gt;
Open the file {CKTESTER_ROOT}/variables.js.tpl with modification to the following variables:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;	// Absolute path point to the root path of CKEditor project.&lt;br /&gt;
	'CKEDITOR_ROOT'&amp;amp;nbsp;: '/ckeditor',&lt;br /&gt;
&lt;br /&gt;
        // Point to the root path of CKEditor test branch.&lt;br /&gt;
          ( You don't need to alter it if your web server's serving root from CKEDITOR_TEST_ROOT.&lt;br /&gt;
       'CKEDITOR_TEST_BRANCH_ROOT'&amp;amp;nbsp;: '/'&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
At last, run the script {CKTESTER_ROOT}/_dev/gen-profile.bat(.sh) ( you'll need install [http://ant.apache.org/ Apache Ant] ) which helps you to generate the testing profile automatically by scanning the resources within {CKEDITOR_TEST_ROOT}. After that, you'll get a file created at {CKTESTER_ROOT}/template.js which looks basically like: &lt;br /&gt;
&amp;lt;pre&amp;gt;	CKTESTER.fort.getProfile = function ()&lt;br /&gt;
	{&lt;br /&gt;
		return {&lt;br /&gt;
			cells&amp;amp;nbsp;:&lt;br /&gt;
			[&lt;br /&gt;
			// Generated cell paths...&lt;br /&gt;
			],&lt;br /&gt;
			cellResolvers&amp;amp;nbsp;:&lt;br /&gt;
			[&lt;br /&gt;
			// Some Default cell resolvers. &lt;br /&gt;
			]&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
It's done, now point your web browser at {CKEDITOR_TEST_ROOT}/index.html, a few pilot links there to kick start you testing.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
== History  ==&lt;br /&gt;
&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2689</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2689"/>
				<updated>2009-09-24T08:54:49Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser&amp;amp;nbsp;: locally, on a web server or via secure connections. &lt;br /&gt;
&lt;br /&gt;
== How It Works  ==&lt;br /&gt;
&lt;br /&gt;
=== Test Cell  ===&lt;br /&gt;
&lt;br /&gt;
A '''test cell''' is the basic unit of a project's testing, a plain HTML file reside in individual project's testing source, in which test suites/cases are written. It will be loaded and executed inside an iframe or popup window depends on the running of choice, so '''full page life cycle''' ( from page load to page destroy ) is guaranteed. &lt;br /&gt;
&lt;br /&gt;
Each cell has one key responsibility of '''reporting''' the sucess/failure/time of it's execution to the fort, this is done by cross-frame communication with parent/opener window. For this, the cell is required to include a bootstrap file: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;{CKTester_ROOT}/bootstrap.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The cell's entire testing environment, including testing target, runtime libraries, etc. will mostly be injected by the fort, which are declared by a meta tag of the HTML file. &lt;br /&gt;
&amp;lt;pre&amp;gt;// I'm a unit test for the editor(CKEditor) and the TCs within me are stable( been finalized ). &lt;br /&gt;
&amp;amp;lt;meta name=&amp;quot;tags&amp;quot; content=&amp;quot;editor,unit,stable&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
A cell could be running in '''two modes''': &lt;br /&gt;
&lt;br /&gt;
#Managed Mode&amp;amp;nbsp;: It's the default mode when it's running in a batch of cells by the forge, where the cell is running in an iframe. &lt;br /&gt;
#Standalone Mode&amp;amp;nbsp;: When a cell is running separately, on the opposite of 'Managed Mode', the cell will be running inside a popup window, this is&lt;br /&gt;
&lt;br /&gt;
often used when it's a manual test case or detailed information about the TCs is required to be reviewed( e.g. which exactly test method failed in the TC? ). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Profile  ===&lt;br /&gt;
&lt;br /&gt;
A '''testing profile''' is a JavaScript configuration file which specify how a project is to be tested by CKTester. It contains a function which return a configuration object.&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#Cells list&amp;amp;nbsp;: A list of key/values which tells where are the cells and what are the tags of each cell.&amp;lt;br&amp;gt;Key&amp;amp;nbsp;: The test cell '''file path''', where all the paths are relative to the runner; &amp;lt;br&amp;gt;Value&amp;amp;nbsp;: An array of '''tags''' of that cell.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Cell resolvers&amp;amp;nbsp;: An array of function which were used to manipulate each cell's attributes, e.g. Inject necessary dependencies for cells which have certain tags. These are the complementary of those resolvers that the '''fort '''already has.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file content will basically looks like: &lt;br /&gt;
&amp;lt;pre&amp;gt;CKTester.profile = function ()&lt;br /&gt;
{&lt;br /&gt;
	return&lt;br /&gt;
	{&lt;br /&gt;
		cells&amp;amp;nbsp;: [&lt;br /&gt;
			[ '/dt/unit/plugins/htmldataprocessor/1' ], 		// Implicit tag declaration( each sub path form a tag ).&lt;br /&gt;
			[ '/tt/1.html' , [ 'editor', 'unit', 'htmldataprocessor' ] ]  // Explicit tag declaration.&lt;br /&gt;
		]&lt;br /&gt;
		cellResolvers&amp;amp;nbsp;:&lt;br /&gt;
		[&lt;br /&gt;
			function( cell )&lt;br /&gt;
			{&lt;br /&gt;
				var tags = cell.tags, env = cell.environment;&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor source.&lt;br /&gt;
				if( ( tags.indexOf( 'editor' )&amp;amp;nbsp;!= -1 )&lt;br /&gt;
					&amp;amp;amp;&amp;amp;amp; ( tags.indexOf( 'editor-ondemand' ) == -1  ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_source.js' );&lt;br /&gt;
				else if ( tags.indexOf( 'editor-ondemand' ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_basic_source.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor unit test library.&lt;br /&gt;
				if ( tags.indexOf( 'unit' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/unit.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor manual test library.&lt;br /&gt;
				if ( tags.indexOf( 'manual' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/manual.js' );&lt;br /&gt;
			}&lt;br /&gt;
		]&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note''': the testing profile is recommanded to be generated automatically by the gen-profile tool script, but it could be altered manually as well.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Tags  ===&lt;br /&gt;
&lt;br /&gt;
'''Tag''' is playing an important role as the indicator of a cell with the following aspects: &lt;br /&gt;
&lt;br /&gt;
#Environments( dependencies ) of a cell, e.g. if the cell has tags 'unit' and 'editor', it denote it must be running under a unit test runner( e.g. YUITest ), and the testing target is CKEditor; &lt;br /&gt;
#Categories of the cell, could be used to grouping similar cells. E.g. A cell with a path 'dt/core/dom/documentfragment' denote it's design test for the core codes of dom module about document-fragment. &lt;br /&gt;
#Any other reasonable denotation.&lt;br /&gt;
&lt;br /&gt;
=== Fort  ===&lt;br /&gt;
&lt;br /&gt;
The '''Test Fort''' is a central hub for registering and running all the cells, which also consist of a UI to specific criteria and providing report. &lt;br /&gt;
&lt;br /&gt;
The runner is driven by the specified profile( use the default one if not specified ), from which all cells are registering. Upon requesting by a specific criteria, it filtering down the registered cells to only execute the satisfied ones. &lt;br /&gt;
&lt;br /&gt;
During the loading of each cell before running, an extensible '''cell resolver''' will manipulate ( to figure out the required/requested resources of a specific cell ) the cell by analysing it's tags, guarantee the cell always has all the environment it should receive. These resources are typically composed of&amp;amp;nbsp;: &lt;br /&gt;
&lt;br /&gt;
*The testing target &lt;br /&gt;
*The testing library &lt;br /&gt;
*Any resources dedicated to the cell.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At last the cell will be running in one of these '''two modes''' depend on the user: &lt;br /&gt;
&lt;br /&gt;
#Managed Mode&amp;amp;nbsp;: It's the default mode when it's running in a batch of cells by the forge, where the cell is running in an iframe. &lt;br /&gt;
#Standalone Mode&amp;amp;nbsp;: When a cell is running separately, on the opposite of 'Managed Mode', the cell will be running inside a popup window, this is&lt;br /&gt;
&lt;br /&gt;
often used when it's a manual test case or detailed information about the TCs is required to be reviewed( e.g. which exactly test method failed in the TC? ). &lt;br /&gt;
&lt;br /&gt;
=== Testing Criteria  ===&lt;br /&gt;
&lt;br /&gt;
A criteria is simply a URL request to the fort which specify which cells to be run. &lt;br /&gt;
&lt;br /&gt;
#It could contains a path to the profile to be used. &lt;br /&gt;
#It could contains certain tags only with which the cells to be run. &lt;br /&gt;
#It could explicitly specify a single cell location along with certain tags.&lt;br /&gt;
&lt;br /&gt;
Some example criteria look like: &lt;br /&gt;
&lt;br /&gt;
*Running all cells defined in a specified profile file: http://ckeditor.t/cktester/fort.html?profile=../myprofile.js &lt;br /&gt;
*Running all the stable unit tests of the default profile: http://ckeditor.t/cktester/fort.html?cells=stable,unit &lt;br /&gt;
*Running a specific ticket test with tags 'editor','unit','all' : http://ckeditor.t/cktester/fort.html?cells=http://ckeditor.t/tt/4397/1.html&amp;amp;amp;tags=editor,unit,all&amp;lt;br&amp;gt;( '''Note''': It's a shortcut to achieved the same criteria by just open the url of that individual cell (http://ckeditor.t/tt/4397/1.html) and it will be redirected correctly back to the forge. )&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': Below we'll take the CKEditor project as an example to illustrate the install process. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; First of all, checking out these three component: the staging project, it's test suites and CKTester eventually. &lt;br /&gt;
&lt;br /&gt;
#Checkout CKEditor's testing branch from [http://svn.fckeditor.net/CKEditor/tests SVN] ( We name the working copy path as CKEDITOR_TEST_ROOT below ). &amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKEditor trunk( or any other version are subjected to test ) from [http://svn.fckeditor.net/CKEditor/trunk/ SVN] into a folder ( e.g. ckeditor ) under CKEDITOR_TEST_ROOT ( We name the working copy path as CKEDITOR_ROOT below ).&amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKTester from [http://svn.fckeditor.net/CKTester SVN]&amp;amp;nbsp;into a folder( e.g. cktester ) under CKEDITOR_TEST_ROOT( We name the working copy path as CKTESTER_ROOT below ).&lt;br /&gt;
&lt;br /&gt;
Open the file {CKTESTER_ROOT}/variables.js.tpl with modification to the following variables:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;	// Absolute path point to the root path of CKEditor project.&lt;br /&gt;
	'CKEDITOR_ROOT'&amp;amp;nbsp;: '/ckeditor',&lt;br /&gt;
&lt;br /&gt;
        // Point to the root path of CKEditor test branch.&lt;br /&gt;
          ( You don't need to alter it if your web server's serving root from CKEDITOR_TEST_ROOT.&lt;br /&gt;
       'CKEDITOR_TEST_BRANCH_ROOT'&amp;amp;nbsp;: '/'&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
At last, run the script {CKTESTER_ROOT}/_dev/gen-profile.bat(.sh) ( you'll need install [http://ant.apache.org/ Apache Ant] ) which helps you to generate the testing profile automatically by scanning the resources within {CKEDITOR_TEST_ROOT}. After that, you'll get a file created at {CKTESTER_ROOT}/template.js which looks basically like: &lt;br /&gt;
&amp;lt;pre&amp;gt;	CKTESTER.fort.getProfile = function ()&lt;br /&gt;
	{&lt;br /&gt;
		return {&lt;br /&gt;
			cells&amp;amp;nbsp;:&lt;br /&gt;
			[&lt;br /&gt;
			// Generated cell paths...&lt;br /&gt;
			],&lt;br /&gt;
			cellResolvers&amp;amp;nbsp;:&lt;br /&gt;
			[&lt;br /&gt;
			// Some Default cell resolvers. &lt;br /&gt;
			]&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
It's done, now point your web browser at {CKEDITOR_TEST_ROOT}/index.html, a few pilot links there to kick start you testing.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
== History  ==&lt;br /&gt;
&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2688</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2688"/>
				<updated>2009-09-24T08:25:17Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser&amp;amp;nbsp;: locally, on a web server or via secure connections. &lt;br /&gt;
&lt;br /&gt;
== How It Works  ==&lt;br /&gt;
&lt;br /&gt;
=== Test Cell  ===&lt;br /&gt;
&lt;br /&gt;
A '''test cell''' is the basic unit of a project's testing, a plain HTML file reside in individual project's testing source, in which test suites/cases are written. It will be loaded and executed inside an iframe or popup window depends on the running of choice, so '''full page life cycle''' ( from page load to page destroy ) is guaranteed. &lt;br /&gt;
&lt;br /&gt;
Each cell has one key responsibility of '''reporting''' the sucess/failure/time of it's execution to the fort, this is done by cross-frame communication with parent/opener window. For this, the cell is required to include a bootstrap file: &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;{CKTester_ROOT}/bootstrap.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
The cell's entire testing environment, including testing target, runtime libraries, etc. will mostly be injected by the fort, which are declared by a meta tag of the HTML file. &lt;br /&gt;
&amp;lt;pre&amp;gt;// I'm a unit test for the editor(CKEditor) and the TCs within me are stable( been finalized ). &lt;br /&gt;
&amp;amp;lt;meta name=&amp;quot;tags&amp;quot; content=&amp;quot;editor,unit,stable&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
A cell could be running in '''two modes''': &lt;br /&gt;
&lt;br /&gt;
#Managed Mode&amp;amp;nbsp;: It's the default mode when it's running in a batch of cells by the forge, where the cell is running in an iframe. &lt;br /&gt;
#Standalone Mode&amp;amp;nbsp;: When a cell is running separately, on the opposite of 'Managed Mode', the cell will be running inside a popup window, this is&lt;br /&gt;
&lt;br /&gt;
often used when it's a manual test case or detailed information about the TCs is required to be reviewed( e.g. which exactly test method failed in the TC? ). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Profile  ===&lt;br /&gt;
&lt;br /&gt;
A '''testing profile''' is a JavaScript configuration file which specify how a project is to be tested by CKTester. It contains a function which return a configuration object.&amp;amp;nbsp;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Cells list&amp;amp;nbsp;: A list of key/values which tells where are the cells and what are the tags of each cell.&amp;lt;br&amp;gt;Key&amp;amp;nbsp;: The test cell '''file path''', where all the paths are relative to the runner; &amp;lt;br&amp;gt;Value&amp;amp;nbsp;: An array of '''tags''' of that cell.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Cell resolvers&amp;amp;nbsp;: An array of function which were used to manipulate each cell's attributes, e.g. Inject necessary dependencies for cells which have certain tags. These are the complementary of those resolvers that the '''fort '''already has.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file content will basically looks like: &lt;br /&gt;
&amp;lt;pre&amp;gt;CKTester.profile = function ()&lt;br /&gt;
{&lt;br /&gt;
	return&lt;br /&gt;
	{&lt;br /&gt;
		cells&amp;amp;nbsp;: [&lt;br /&gt;
			[ '/dt/unit/plugins/htmldataprocessor/1' ], 		// Implicit tag declaration( each sub path form a tag ).&lt;br /&gt;
			[ '/tt/1.html' , [ 'editor', 'unit', 'htmldataprocessor' ] ]  // Explicit tag declaration.&lt;br /&gt;
		]&lt;br /&gt;
		cellResolvers&amp;amp;nbsp;:&lt;br /&gt;
		[&lt;br /&gt;
			function( cell )&lt;br /&gt;
			{&lt;br /&gt;
				var tags = cell.tags, env = cell.environment;&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor source.&lt;br /&gt;
				if( ( tags.indexOf( 'editor' )&amp;amp;nbsp;!= -1 )&lt;br /&gt;
					&amp;amp;amp;&amp;amp;amp; ( tags.indexOf( 'editor-ondemand' ) == -1  ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_source.js' );&lt;br /&gt;
				else if ( tags.indexOf( 'editor-ondemand' ) )&lt;br /&gt;
					env.push( '${CKEDITOR_ROOT}/ckeditor_basic_source.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor unit test library.&lt;br /&gt;
				if ( tags.indexOf( 'unit' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/unit.js' );&lt;br /&gt;
&lt;br /&gt;
				// Inject CKEditor manual test library.&lt;br /&gt;
				if ( tags.indexOf( 'manual' )&amp;amp;nbsp;!= -1  )&lt;br /&gt;
					env.push( '${CKEDITOR_TEST_BRANCH_ROOT}/js/manual.js' );&lt;br /&gt;
			}&lt;br /&gt;
		]&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note''': the testing profile is recommanded to be generated automatically by the gen-profile tool script, but it could be altered manually as well.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tags  ===&lt;br /&gt;
&lt;br /&gt;
'''Tag''' is playing an important role as the indicator of a cell with the following aspects: &lt;br /&gt;
&lt;br /&gt;
#Environments( dependencies ) of a cell, e.g. if the cell has tags 'unit' and 'editor', it denote it must be running under a unit test runner( e.g. YUITest ), and the testing target is CKEditor; &lt;br /&gt;
#Categories of the cell, could be used to grouping similar cells. E.g. A cell with a path 'dt/core/dom/documentfragment' denote it's design test for the core codes of dom module about document-fragment. &lt;br /&gt;
#Any other reasonable denotation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': Below we'll take the CKEditor project as an example to illustrate the install process. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; First of all, checking out these three component: the staging project, it's test suites and CKTester eventually. &lt;br /&gt;
&lt;br /&gt;
#Checkout CKEditor's testing branch from [http://svn.fckeditor.net/CKEditor/tests SVN] ( We name the working copy path as CKEDITOR_TEST_ROOT below ). &amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKEditor trunk( or any other version are subjected to test ) from [http://svn.fckeditor.net/CKEditor/trunk/ SVN] into a folder ( e.g. ckeditor ) under CKEDITOR_TEST_ROOT ( We name the working copy path as CKEDITOR_ROOT below ).&amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKTester from [http://svn.fckeditor.net/CKTester SVN]&amp;amp;nbsp;into a folder( e.g. cktester ) under CKEDITOR_TEST_ROOT( We name the working copy path as CKTESTER_ROOT below ).&lt;br /&gt;
&lt;br /&gt;
Open the file {CKTESTER_ROOT}/variables.js.tpl with modification to the following variables:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;	// Absolute path point to the root path of CKEditor project.&lt;br /&gt;
	'CKEDITOR_ROOT'&amp;amp;nbsp;: '/ckeditor',&lt;br /&gt;
&lt;br /&gt;
        // Point to the root path of CKEditor test branch.&lt;br /&gt;
          ( You don't need to alter it if your web server's serving root from CKEDITOR_TEST_ROOT.&lt;br /&gt;
       'CKEDITOR_TEST_BRANCH_ROOT'&amp;amp;nbsp;: '/'&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
At last, run the script {CKTESTER_ROOT}/_dev/gen-profile.bat(.sh) ( you'll need install [http://ant.apache.org/ Apache Ant] ) which helps you to generate the testing profile automatically by scanning the resources within {CKEDITOR_TEST_ROOT}. After that, you'll get a file created at {CKTESTER_ROOT}/template.js which looks basically like: &lt;br /&gt;
&amp;lt;pre&amp;gt;	CKTESTER.fort.getProfile = function ()&lt;br /&gt;
	{&lt;br /&gt;
		return {&lt;br /&gt;
			cells&amp;amp;nbsp;:&lt;br /&gt;
			[&lt;br /&gt;
			// Generated cell paths...&lt;br /&gt;
			],&lt;br /&gt;
			cellResolvers&amp;amp;nbsp;:&lt;br /&gt;
			[&lt;br /&gt;
			// Some Default cell resolvers. &lt;br /&gt;
			]&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
It's done, now point your web browser at {CKEDITOR_TEST_ROOT}/index.html, a few pilot links there to kick start you testing.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
== History  ==&lt;br /&gt;
&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2687</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2687"/>
				<updated>2009-09-24T08:02:42Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser&amp;amp;nbsp;: locally, on a web server or via secure connections. &lt;br /&gt;
&lt;br /&gt;
== How It Works ==&lt;br /&gt;
&lt;br /&gt;
=== Test Cell ===&lt;br /&gt;
&lt;br /&gt;
A '''test cell''' is the basic unit of a project's testing, a plain HTML file reside in individual project's testing source, in which test suites/cases&lt;br /&gt;
are written. It will be loaded and executed inside an iframe or popup window depends on the running of choice, so '''full page life cycle'''&lt;br /&gt;
( from page load to page destroy ) is guaranteed.&lt;br /&gt;
&lt;br /&gt;
Each cell has one key responsibility of '''reporting''' the sucess/failure/time of it's execution to the fort, this is&lt;br /&gt;
done by cross-frame communication with parent/opener window. For this, the cell is required to include a bootstrap file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;{CKTester_ROOT}/bootstrap.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The cell's entire testing environment, including testing target, runtime libraries, etc. will mostly be injected by the fort,&lt;br /&gt;
which are declared by a meta tag of the HTML file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// I'm a unit test for the editor(CKEditor) and the TCs within me are stable( been finalized ). &lt;br /&gt;
&amp;lt;meta name=&amp;quot;tags&amp;quot; content=&amp;quot;editor,unit,stable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A cell could be running in '''two modes''':&lt;br /&gt;
# Managed Mode : It's the default mode when it's running in a batch of cells by the forge, where the cell is running in an iframe.&lt;br /&gt;
# Standalone Mode : When a cell is running separately, on the opposite of 'Managed Mode', the cell will be running inside a popup window, this is&lt;br /&gt;
often used when it's a manual test case or detailed information about the TCs is required to be reviewed( e.g. which exactly test method failed in the TC? ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': Below we'll take the CKEditor project as an example to illustrate the install process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First of all, checking out these three component: the staging project, it's test suites and CKTester eventually.&lt;br /&gt;
#Checkout CKEditor's testing branch from [http://svn.fckeditor.net/CKEditor/tests SVN] ( We name the working copy path as CKEDITOR_TEST_ROOT below ). &amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKEditor trunk( or any other version are subjected to test ) from [http://svn.fckeditor.net/CKEditor/trunk/ SVN] into a folder ( e.g. ckeditor ) under CKEDITOR_TEST_ROOT ( We name the working copy path as CKEDITOR_ROOT below ).&amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKTester from [http://svn.fckeditor.net/CKTester SVN]&amp;amp;nbsp;into a folder( e.g. cktester ) under CKEDITOR_TEST_ROOT( We name the working copy path as CKTESTER_ROOT below ).&lt;br /&gt;
&lt;br /&gt;
Open the file {CKTESTER_ROOT}/variables.js.tpl with modification to the following variables:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;	// Absolute path point to the root path of CKEditor project.&lt;br /&gt;
	'CKEDITOR_ROOT'&amp;amp;nbsp;: '/ckeditor',&lt;br /&gt;
&lt;br /&gt;
        // Point to the root path of CKEditor test branch.&lt;br /&gt;
          ( You don't need to alter it if your web server's serving root from CKEDITOR_TEST_ROOT.&lt;br /&gt;
       'CKEDITOR_TEST_BRANCH_ROOT'&amp;amp;nbsp;: '/'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At last, run the script {CKTESTER_ROOT}/_dev/gen-profile.bat(.sh) ( you'll need install [http://ant.apache.org/ Apache Ant] ) which helps you to generate the testing profile automatically by scanning the resources within {CKEDITOR_TEST_ROOT}. After that, you'll get a file created at {CKTESTER_ROOT}/template.js which looks basically like:&lt;br /&gt;
&amp;lt;pre&amp;gt;	CKTESTER.fort.getProfile = function ()&lt;br /&gt;
	{&lt;br /&gt;
		return {&lt;br /&gt;
			cells :&lt;br /&gt;
			[&lt;br /&gt;
			// Generated cell paths...&lt;br /&gt;
			],&lt;br /&gt;
			cellResolvers :&lt;br /&gt;
			[&lt;br /&gt;
			// Some Default cell resolvers. &lt;br /&gt;
			]&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It's done, now point your web browser at {CKEDITOR_TEST_ROOT}/index.html, a few pilot links there to kick start you testing.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
== History  ==&lt;br /&gt;
&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2686</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2686"/>
				<updated>2009-09-24T07:43:48Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser&amp;amp;nbsp;: locally, on a web server or via secure connections. &lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': Below we'll take the CKEditor project as an example to illustrate the install process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First of all, checking out these three component: the staging project, it's test suites and CKTester eventually.&lt;br /&gt;
#Checkout CKEditor's testing branch from [http://svn.fckeditor.net/CKEditor/tests SVN] ( We name the working copy path as CKEDITOR_TEST_ROOT below ). &amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKEditor trunk( or any other version are subjected to test ) from [http://svn.fckeditor.net/CKEditor/trunk/ SVN] into a folder ( e.g. ckeditor ) under CKEDITOR_TEST_ROOT ( We name the working copy path as CKEDITOR_ROOT below ).&amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKTester from [http://svn.fckeditor.net/CKTester SVN]&amp;amp;nbsp;into a folder( e.g. cktester ) under CKEDITOR_TEST_ROOT( We name the working copy path as CKTESTER_ROOT below ).&lt;br /&gt;
&lt;br /&gt;
Open the file {CKTESTER_ROOT}/variables.js.tpl with modification to the following variables:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;	// Absolute path point to the root path of CKEditor project.&lt;br /&gt;
	'CKEDITOR_ROOT'&amp;amp;nbsp;: '/ckeditor',&lt;br /&gt;
&lt;br /&gt;
        // Point to the root path of CKEditor test branch.&lt;br /&gt;
          ( You don't need to alter it if your web server's serving root from CKEDITOR_TEST_ROOT.&lt;br /&gt;
       'CKEDITOR_TEST_BRANCH_ROOT'&amp;amp;nbsp;: '/'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At last, run the script {CKTESTER_ROOT}/_dev/gen-profile.bat(.sh) ( you'll need install [http://ant.apache.org/ Apache Ant] ) which helps you to generate the testing profile automatically by scanning the resources within {CKEDITOR_TEST_ROOT}. After that, you'll get a file created at {CKTESTER_ROOT}/template.js which looks basically like:&lt;br /&gt;
&amp;lt;pre&amp;gt;	CKTESTER.fort.getProfile = function ()&lt;br /&gt;
	{&lt;br /&gt;
		return {&lt;br /&gt;
			cells :&lt;br /&gt;
			[&lt;br /&gt;
			// Generated cell paths...&lt;br /&gt;
			],&lt;br /&gt;
			cellResolvers :&lt;br /&gt;
			[&lt;br /&gt;
			// Some Default cell resolvers. &lt;br /&gt;
			]&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It's done, now point your web browser at {CKEDITOR_TEST_ROOT}/index.html, a few pilot links there to kick start you testing.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
== History  ==&lt;br /&gt;
&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2685</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2685"/>
				<updated>2009-09-24T07:42:05Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser&amp;amp;nbsp;: locally, on a web server or via secure connections. &lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
'''Note''': Below we'll take the CKEditor project as an example to illustrate the install process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First of all, checking out these three component: the staging project, it's test suites and CKTester eventually.&lt;br /&gt;
#Checkout CKEditor's testing branch from SVN ( We name the working copy path as CKEDITOR_TEST_ROOT below ). &amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKEditor trunk( or any other version are subjected to test ) from [http://svn.fckeditor.net/CKEditor/trunk/ SVN] into a folder ( e.g. ckeditor ) under CKEDITOR_TEST_ROOT ( We name the working copy path as CKEDITOR_ROOT below ).&amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKTester from [http://svn.fckeditor.net/CKTester SVN]&amp;amp;nbsp;into a folder( e.g. cktester ) under CKEDITOR_TEST_ROOT( We name the working copy path as CKTESTER_ROOT below ).&lt;br /&gt;
&lt;br /&gt;
Open the file {CKTESTER_ROOT}/variables.js.tpl with modification to the following variables:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;	// Absolute path point to the root path of CKEditor project.&lt;br /&gt;
	'CKEDITOR_ROOT'&amp;amp;nbsp;: '/ckeditor',&lt;br /&gt;
&lt;br /&gt;
        // Point to the root path of CKEditor test branch.( You don't need to alter it if your web server's serving root from CKEDITOR_TEST_ROOT.&lt;br /&gt;
       'CKEDITOR_TEST_BRANCH_ROOT'&amp;amp;nbsp;: '/'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At last, run the script {CKTESTER_ROOT}/_dev/gen-profile.bat(.sh) ( you'll need install [http://ant.apache.org/ Apache Ant] ) which helps you to generate the testing profile automatically by scanning the resources within {CKEDITOR_TEST_ROOT}. After that, you'll get a file created at {CKTESTER_ROOT}/template.js which looks basically like:&lt;br /&gt;
&amp;lt;pre&amp;gt;	CKTESTER.fort.getProfile = function ()&lt;br /&gt;
	{&lt;br /&gt;
		return {&lt;br /&gt;
			cells :&lt;br /&gt;
			[&lt;br /&gt;
			// Generated cell paths...&lt;br /&gt;
			],&lt;br /&gt;
			cellResolvers :&lt;br /&gt;
			[&lt;br /&gt;
			// Some Default cell resolvers. &lt;br /&gt;
			]&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It's done, now point your web browser at {CKEDITOR_TEST_ROOT}/index.html, a few pilot links there to kick start you testing.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
== History  ==&lt;br /&gt;
&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2684</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2684"/>
				<updated>2009-09-24T07:31:45Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser&amp;amp;nbsp;: locally, on a web server or via secure connections. &lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
Below we'll take the CKEditor project as an example to illustrate the install process: &lt;br /&gt;
&lt;br /&gt;
#Checkout CKEditor's testing branch from SVN ( We name the working copy path as CKEDITOR_TEST_ROOT below ). &amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKEditor trunk( or any other version are subjected to test ) from [http://svn.fckeditor.net/CKEditor/trunk/ SVN] into a folder ( e.g. ckeditor ) under CKEDITOR_TEST_ROOT ( We name the working copy path as CKEDITOR_ROOT below ).&amp;lt;br&amp;gt; &lt;br /&gt;
#Checkout CKTester from [http://svn.fckeditor.net/CKTester SVN]&amp;amp;nbsp;into a folder( e.g. cktester ) under CKEDITOR_TEST_ROOT( We name the working copy path as CKTESTER_ROOT below ). &amp;lt;br&amp;gt;&lt;br /&gt;
#Open the file {CKTESTER_ROOT}/variables.js.tpl with modification to the following variables:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;	// Absolute path point to the root path of CKEditor project.&lt;br /&gt;
	'CKEDITOR_ROOT'&amp;amp;nbsp;: '/ckeditor',&lt;br /&gt;
&lt;br /&gt;
        // Point to the root path of CKEditor test branch.( You don't need to alter it if your web server's serving root from CKEDITOR_TEST_ROOT.&lt;br /&gt;
       'CKEDITOR_TEST_BRANCH_ROOT'&amp;amp;nbsp;: '/'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
#At last, run the script {CKTESTER_ROOT}/_dev/gen-profile.bat(.sh) ( you'll need install [http://ant.apache.org/ Apache Ant] ) which helps you to generate the testing profile automatically by scanning the resources within {CKEDITOR_TEST_ROOT}.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;After that, you'll get a file created at {CKTESTER_ROOT}/template.js which looks basically like:&lt;br /&gt;
&amp;lt;pre&amp;gt;	CKTESTER.fort.getProfile = function ()&lt;br /&gt;
	{&lt;br /&gt;
		return {&lt;br /&gt;
			cells :&lt;br /&gt;
			[&lt;br /&gt;
			// Generated cell paths...&lt;br /&gt;
			],&lt;br /&gt;
			cellResolvers :&lt;br /&gt;
			[&lt;br /&gt;
			// Some Default cell resolvers. &lt;br /&gt;
			]&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
#It's done, now point your web browser at {CKEDITOR_TEST_ROOT}/index.html, a few pilot links there to kick start you testing.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
== History  ==&lt;br /&gt;
&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2683</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2683"/>
				<updated>2009-09-24T06:55:56Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview  ==&lt;br /&gt;
&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser&amp;amp;nbsp;: locally, on a web server or via secure connections. &lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
Below we'll take the CKEditor project as an example to illustrate the install process: &lt;br /&gt;
&lt;br /&gt;
#Checkout CKEditor trunk( or any other version are subjected to test) from [http://svn.fckeditor.net/CKEditor/trunk/ SVN]&amp;amp;nbsp;( We name the working copy path as CKEDITOR_ROOT below ).&lt;br /&gt;
#Checkout CKEditor's testing branch from [http://svn.fckeditor.net/CKEditor/tests/ SVN]&amp;amp;nbsp;( We name the working copy path as CKEDITOR_TEST_ROOT below ).&lt;br /&gt;
#Checkout CKTester from [http://svn.fckeditor.net/CKTester SVN]&amp;amp;nbsp;into a folder( e.g. cktester ) under CKEDITOR_TEST_ROOT( We name the working copy path as CKTESTER_ROOT below ).&lt;br /&gt;
#Open the file {CKTESTER_ROOT}/variables.js.tpl with modification to the following variables:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
#&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Common Tasks  ==&lt;br /&gt;
&lt;br /&gt;
== History  ==&lt;br /&gt;
&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	<entry>
		<id>https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2682</id>
		<title>CKTester/Users Guide</title>
		<link rel="alternate" type="text/html" href="https://docs-old.ckeditor.com/index.php?title=CKTester/Users_Guide&amp;diff=2682"/>
				<updated>2009-09-24T06:22:03Z</updated>
		
		<summary type="html">&lt;p&gt;Garryyao: Initliaze CKTester user's guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
'''CKTester''' is our internal testing hub, created to provide seamless and integrated testing experience to our developers, been capable of managing and interfacing tests from various projects which may potentially rely on different testing frameworks/runners. Been designed with convenient authoring and ease of viewing the test cases in mind, it could be running independently in all situation from a browser : locally, on a web server or via secure connections.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
== Common Tasks ==&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
CKTester is evolved from previous project '''FCKTest'''.&lt;/div&gt;</summary>
		<author><name>Garryyao</name></author>	</entry>

	</feed>