Difference between revisions of "Extension:Selenium.php"
m (organise) |
(Use $wgRequest, and remove Sysop user rights) |
||
Line 1: | Line 1: | ||
− | + | <?php | |
/** | /** | ||
Line 9: | Line 9: | ||
if (!defined('MEDIAWIKI')) die('Not an entry point.'); | if (!defined('MEDIAWIKI')) die('Not an entry point.'); | ||
− | define('SELENIUM_VERSION','0.7. | + | define('SELENIUM_VERSION','0.7.1, 2007-12-03, selenium-core 0.8.3'); |
$egSeleniumTag = "selenium"; | $egSeleniumTag = "selenium"; | ||
Line 34: | Line 34: | ||
require_once "$IP/includes/SpecialPage.php"; | require_once "$IP/includes/SpecialPage.php"; | ||
+ | |||
class Selenium { | class Selenium { | ||
Line 97: | Line 98: | ||
SpecialPage::SpecialPage( | SpecialPage::SpecialPage( | ||
'Selenium', # name as seen in links etc | 'Selenium', # name as seen in links etc | ||
− | ' | + | '', # user rights required |
true, # listed in special:specialpages | true, # listed in special:specialpages | ||
false, # function called by execute() - defaults to wfSpecial{$name} | false, # function called by execute() - defaults to wfSpecial{$name} | ||
Line 110: | Line 111: | ||
*/ | */ | ||
function execute() { | function execute() { | ||
− | global $wgOut, $wgParser; | + | global $wgOut, $wgParser, $wgRequest; |
# Process suite or test if ?suite=article_name in query string | # Process suite or test if ?suite=article_name in query string | ||
− | if( | + | if($wgRequest->getText('suite')) { |
− | |||
# Render only Selenium html | # Render only Selenium html | ||
$wgOut->disable(); | $wgOut->disable(); | ||
Line 120: | Line 120: | ||
# Grab article $param and process contents | # Grab article $param and process contents | ||
− | $suiteTitle = Title::newFromText($ | + | $suiteTitle = Title::newFromText($wgRequest->getText('suite')); |
$article = new Article($suiteTitle); | $article = new Article($suiteTitle); | ||
$wikitext = $article->getContent(); | $wikitext = $article->getContent(); | ||
Line 144: | Line 144: | ||
} else { | } else { | ||
# Determine whether suite or test from ?suite=article_name&test=section_num in query string | # Determine whether suite or test from ?suite=article_name&test=section_num in query string | ||
− | if( | + | if($wgRequest->getText('test')) { |
− | $_REQUEST['test'] = preg_replace("/_/", " ", $ | + | $_REQUEST['test'] = preg_replace("/_/", " ", $wgRequest->getText('test')); |
if(in_array($_REQUEST['test'], $matches[1])) { | if(in_array($_REQUEST['test'], $matches[1])) { | ||
$counter = 0; | $counter = 0; | ||
foreach($matches[1] as $value) { | foreach($matches[1] as $value) { | ||
− | if($value == $ | + | if($value == $wgRequest->getText('test')) { |
# Generating test html | # Generating test html | ||
$matches[2][$counter] = preg_replace('|.+?<selenium>\n?(.+?)</selenium>|ms', "\\1", $matches[2][$counter]); | $matches[2][$counter] = preg_replace('|.+?<selenium>\n?(.+?)</selenium>|ms', "\\1", $matches[2][$counter]); | ||
Line 158: | Line 158: | ||
} | } | ||
} else { | } else { | ||
− | $this -> build404("Specified test does not exist in " . $ | + | $this -> build404("Specified test does not exist in " . $wgRequest->getText('suite')); |
} | } | ||
} else { | } else { | ||
Line 167: | Line 167: | ||
array_push($suite_urls, $value); | array_push($suite_urls, $value); | ||
} | } | ||
− | print $this->buildSuite($suite_urls, $ | + | print $this->buildSuite($suite_urls, $wgRequest->getText('suite')); |
} | } | ||
} | } | ||
Line 186: | Line 186: | ||
$article = new Article($suiteTitle); | $article = new Article($suiteTitle); | ||
$wikitext = $article->getContent(); | $wikitext = $article->getContent(); | ||
− | if( | + | if( $this->articleRegex($wikitext, $matches) ) { |
$suites[] = $articleName; | $suites[] = $articleName; | ||
} | } | ||
Line 195: | Line 195: | ||
} | } | ||
$selectTag .= '</select>'; | $selectTag .= '</select>'; | ||
− | + | ||
$this->setHeaders(); | $this->setHeaders(); | ||
$title = Title::makeTitle(NS_SPECIAL,'Selenium'); | $title = Title::makeTitle(NS_SPECIAL,'Selenium'); | ||
Line 208: | Line 208: | ||
. '</form>' | . '</form>' | ||
); | ); | ||
− | + | ||
− | + | if($wgRequest->getText('action')) { | |
− | + | $path .= urlencode($wgRequest->getText('selenium')); | |
− | + | $wgOut->addWikiText("==Selenium suite=="); | |
− | + | $wgOut->addHTML("<a href=\"$path\">" . $wgRequest->getText('selenium') . '</a>'); | |
− | + | } | |
+ | } | ||
} | } | ||
− | + | ||
− | + | ||
function articleRegex(&$wikitext,&$matches) { | function articleRegex(&$wikitext,&$matches) { | ||
$count = preg_match_all('|^={2,}\s*([^\#\<\>\[\]\|\{\}\n]+?)\s*={2,}(.+?</selenium>)|ms',$wikitext,$matches); | $count = preg_match_all('|^={2,}\s*([^\#\<\>\[\]\|\{\}\n]+?)\s*={2,}(.+?</selenium>)|ms',$wikitext,$matches); | ||
Line 246: | Line 247: | ||
# Called from $wgExtensionFunctions array when initialising extensions | # Called from $wgExtensionFunctions array when initialising extensions | ||
function efSetupSelenium() { | function efSetupSelenium() { | ||
+ | global $wgRequest; | ||
+ | #print preg_replace("/_/", " ", $_REQUEST['test']); | ||
+ | |||
global $egSelenium, $wgLanguageCode, $wgMessageCache; | global $egSelenium, $wgLanguageCode, $wgMessageCache; | ||
$egSelenium = new Selenium(); | $egSelenium = new Selenium(); |
Revision as of 07:41, 8 January 2008
<?php
/** * Extension:Selenium Template:Php
Category:Extensions in progress
* Category:SeleniumCategory:Extensions created with Template:SpecialPage * - Licenced under LGPL http://www.gnu.org/copyleft/lesser.html * - Author: http://www.organicdesign.co.nz/User:Sven (M Davy) */
if (!defined('MEDIAWIKI')) die('Not an entry point.'); define('SELENIUM_VERSION','0.7.1, 2007-12-03, selenium-core 0.8.3');
$egSeleniumTag = "selenium"; $egSeleniumPath = "/wiki/extensions/Selenium/selenium-core-0/core/TestRunner.html"; $egSpecialPath = "/wiki/index.php?title=Special:Selenium&suite="; $egSeleniumCategory = "Selenium"; $egSeleniumNamespace = "";
/**
* http://www.mediawiki.org/wiki/Manual:Special_pages * $wgSpecialPages['Selenium'] = 'Selenium'; */
$wgExtensionFunctions[] = 'efSetupSelenium'; $wgHooks['LanguageGetMagic'][] = 'efSeleniumLanguageGetMagic';
$wgExtensionCredits['specialpage'][] = array( 'name' => 'Special:Selenium', 'author' => 'User:Sven', 'description' => 'Incorporating Selenium tests into the MediaWiki environment', 'url' => 'http://www.organicdesign.co.nz/Extension:Selenium.php', 'version' => SELENIUM_VERSION );
require_once "$IP/includes/SpecialPage.php";
class Selenium {
- Properties
- Constructor
function __construct() { global $wgHooks,$wgParser,$egSeleniumTag;
- Add the tagHook
$wgParser->setHook($egSeleniumTag,array($this,'tagSelenium')); }
- Deploy tags to allow additional html table tags
function tagSelenium($text,$argv,&$parser) { global $wgTitle, $egSeleniumCategory; /** * Should be a preprocess using first stage of parser * $text = $parser->preprocess($text,$wgTitle,$parser->mOptions); */
- Want the Selenium tag to strip out ... enclosing tags
$text = eregi_replace('.+
);
- Constructor
function __construct() { SpecialPage::SpecialPage(
'Selenium', # name as seen in links etc , # user rights required true, # listed in special:specialpages false, # function called by execute() - defaults to wfSpecial{$name} false, # file included by execute() - defaults to Special{$name}.php, only used if no function false # includable );
} /** * -------------------- Create form for Special:Selenium -------------------- * Override SpecialPage::execute() */ function execute() { global $wgOut, $wgParser, $wgRequest;
- Process suite or test if ?suite=article_name in query string
if($wgRequest->getText('suite')) {
- Render only Selenium html
$wgOut->disable(); wfResetOutputBuffers();
- Grab article $param and process contents
$suiteTitle = Title::newFromText($wgRequest->getText('suite')); $article = new Article($suiteTitle); $wikitext = $article->getContent();
- Expanding braces of any transcluded tests
$wikitext = $wgParser->preprocess($wikitext,$suiteTitle,new ParserOptions()); /** * This match is greedy finding last complete match * $count = preg_match_all('|^={2,}\s*(.+?)\s*={2,}.*<selenium>(.+?)</selenium>|ms',$wikitext,$matches); */
- Preparse encapsulations around Selenium tags e.g. <selenium>
$wikitext = preg_replace("|<selenium>|", "selenium", $wikitext); /** * Regex finding sections followed by...</selenum> tags * $count equals 0 if articles contain no sections and corresponding tags */ $matches = array(); if(! $this->articleRegex($wikitext, $matches)) {
$this -> build404('Specified suite contains no selenium test tags');
} else {
- Determine whether suite or test from ?suite=article_name&test=section_num in query string
if($wgRequest->getText('test')) { $_REQUEST['test'] = preg_replace("/_/", " ", $wgRequest->getText('test')); if(in_array($_REQUEST['test'], $matches[1])) { $counter = 0; foreach($matches[1] as $value) { if($value == $wgRequest->getText('test')) {
- Generating test html
$matches[2][$counter] = preg_replace('|.+?<selenium>\n?(.+?)</selenium>|ms', "\\1", $matches[2][$counter]); print $matches[2][$counter]; break; #exit foreach loop when test is found } $counter++; } } else { $this -> build404("Specified test does not exist in " . $wgRequest->getText('suite')); } } else {
- Obtain suite section headers
$suite_urls = array(); foreach($matches[1] as $value) { array_push($suite_urls, $value); } print $this->buildSuite($suite_urls, $wgRequest->getText('suite')); }
} } else { global $egSeleniumCategory;
- Retrieve articles in category labelled $egSeleniumCategory
$list = array(); $dbr = &wfGetDB(DB_SLAVE); $cl = $dbr->tableName('categorylinks'); $res = $dbr->select($cl,'cl_from',"cl_to = '$egSeleniumCategory'",__METHOD__,array('ORDER BY' => 'cl_sortkey')); while ($row = $dbr->fetchRow($res)){
$list[] = Title::newFromID($row[0])->getPrefixedText();
}
- Grab article $param and process contents
$suites = array(); foreach($list as $articleName) {
$suiteTitle = Title::newFromText($articleName); $article = new Article($suiteTitle); $wikitext = $article->getContent(); if( $this->articleRegex($wikitext, $matches) ) { $suites[] = $articleName; }
} $selectTag = '<select name="selenium">'; foreach($suites as $suite) {
$selectTag .= "<option>$suite</option>";
} $selectTag .= '</select>'; $this->setHeaders(); $title = Title::makeTitle(NS_SPECIAL,'Selenium'); $wgOut->addWikiText("Choose a selenium suite to run:"); global $egSeleniumPath, $egSpecialPath; $path = "$egSeleniumPath?test=" . urlencode($egSpecialPath); $wgOut->addHTML(
wfElement('form',array('action' => $title->getLocalURL('action=submit'),'method' => 'post'),null) . $selectTag . wfElement('input',array('type' => 'submit')) . '</form>' );
if($wgRequest->getText('action')) {
$path .= urlencode($wgRequest->getText('selenium')); $wgOut->addWikiText("==Selenium suite=="); $wgOut->addHTML("<a href=\"$path\">" . $wgRequest->getText('selenium') . '</a>');
} } } function articleRegex(&$wikitext,&$matches) { $count = preg_match_all('|^={2,}\s*([^\#\<\>\[\]\|\{\}\n]+?)\s*={2,}(.+?</selenium>)|ms',$wikitext,$matches); return($count); }
- Generate 404 error
function build404($message) { header('HTTP/1.0 404 not Found'); $err = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">404 Error $message
The requested URL was not found on this server.
"; print $err; return; }
- Method to build a suite from an array of tests
function buildSuite($tests, $article) {
$html = $this->suite['header'];
$html .= "$article";
foreach ($tests as $element) {
$html .= "\n<a href=\"/wiki/index.php?title=Special:Selenium&suite=$article&test=$element\">$element</a>";
} $html .= $this->suite['footer']; return $html; }
}
- Called from $wgExtensionFunctions array when initialising extensions
function efSetupSelenium() {
global $wgRequest;
- print preg_replace("/_/", " ", $_REQUEST['test']);
global $egSelenium, $wgLanguageCode, $wgMessageCache; $egSelenium = new Selenium();
- global $sgSeleniumSpecial;
- $egSeleniumSpecial
- Add the messages used by the specialpage
if ($wgLanguageCode == 'en') { $wgMessageCache->addMessages(array(
'selenium' => 'Selenium special page', # The friendly page title 'exampleMessage' => "Example message: $1", ));
}
- Add the specialpage to the environment
SpecialPage::addPage(new SpecialSelenium());
}
- Needed in MediaWiki >1.8.0 for magic word hooks to work properly
function efSeleniumLanguageGetMagic(&$magicWords,$langCode = 0) {
global $egSeleniumMagic; $magicWords[$egSeleniumMagic] = array(0,$egSeleniumMagic); return true;
}