if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' .
- $this->mTitle->getPrefixedDBkey() );
+ $this->getTitle()->getPrefixedDBkey() );
}
return $text;
}
/**
* Set the context title
*
- * @param Title $t
+ * @param Title|null $t
*/
- public function setTitle( $t ) {
+ public function setTitle( Title $t = null ) {
if ( !$t ) {
$t = Title::makeTitle( NS_SPECIAL, 'Badtitle/Parser' );
}
/**
* Accessor for the Title object
*
- * @return Title|null
+ * @return Title
*/
- public function getTitle() {
+ public function getTitle() : Title {
return $this->mTitle;
}
* @param Title|null $x Title object or null to just get the current one
* @return Title
*/
- public function Title( $x = null ) {
+ public function Title( Title $x = null ) : Title {
return wfSetVar( $this->mTitle, $x );
}
*
* @since 1.19
*
- * @throws MWException
* @return Language
*/
public function getTargetLanguage() {
return $target;
} elseif ( $this->mOptions->getInterfaceMessage() ) {
return $this->mOptions->getUserLangObj();
- } elseif ( is_null( $this->mTitle ) ) {
- throw new MWException( __METHOD__ . ': $this->mTitle is null' );
}
- return $this->mTitle->getPageLanguage();
+ return $this->getTitle()->getPageLanguage();
}
/**
}
$url = wfMessage( $urlmsg, $id )->inContentLanguage()->text();
$this->addTrackingCategory( $trackingCat );
- return Linker::makeExternalLink( $url, "{$keyword} {$id}", true, $cssClass, [], $this->mTitle );
+ return Linker::makeExternalLink(
+ $url,
+ "{$keyword} {$id}",
+ true,
+ $cssClass,
+ [],
+ $this->getTitle()
+ );
} elseif ( isset( $m[6] ) && $m[6] !== ''
&& $this->mOptions->getMagicISBNLinks()
) {
$text = Linker::makeExternalLink( $url,
$this->getTargetLanguage()->getConverter()->markNoConversion( $url ),
true, 'free',
- $this->getExternalLinkAttribs( $url ), $this->mTitle );
+ $this->getExternalLinkAttribs( $url ), $this->getTitle() );
# Register it in the output object...
$this->mOutput->addExternalLink( $url );
}
# Funny characters like รถ aren't valid in URLs anyway
# This was changed in August 2004
$s .= Linker::makeExternalLink( $url, $text, false, $linktype,
- $this->getExternalLinkAttribs( $url ), $this->mTitle ) . $dtrail . $trail;
+ $this->getExternalLinkAttribs( $url ), $this->getTitle() ) . $dtrail . $trail;
# Register link in the output object.
$this->mOutput->addExternalLink( $url );
*/
public function getExternalLinkAttribs( $url ) {
$attribs = [];
- $rel = self::getExternalLinkRel( $url, $this->mTitle );
+ $rel = self::getExternalLinkRel( $url, $this->getTitle() );
$target = $this->mOptions->getExternalLinkTarget();
if ( $target ) {
/**
* Process [[ ]] wikilinks (RIL)
* @param string &$s
- * @throws MWException
* @return LinkHolderArray
*
* @private
$line = $a->current(); # Workaround for broken ArrayIterator::next() that returns "void"
$s = substr( $s, 1 );
- if ( is_null( $this->mTitle ) ) {
- throw new MWException( __METHOD__ . ": \$this->mTitle is null\n" );
- }
- $nottalk = !$this->mTitle->isTalkPage();
+ $nottalk = !$this->getTitle()->isTalkPage();
$useLinkPrefixExtension = $this->getTargetLanguage()->linkPrefixExtension();
$e2 = null;
}
if ( $ns == NS_FILE ) {
- if ( !$this->badFileLookup->isBadFile( $nt->getDBkey(), $this->mTitle ) ) {
+ if ( !$this->badFileLookup->isBadFile( $nt->getDBkey(), $this->getTitle() ) ) {
if ( $wasblank ) {
# if no parameters were passed, $text
# becomes something like "File:Foo.png",
# Self-link checking. For some languages, variants of the title are checked in
# LinkHolderArray::doVariants() to allow batching the existence checks necessary
# for linking to a different variant.
- if ( $ns != NS_SPECIAL && $nt->equals( $this->mTitle ) && !$nt->hasFragment() ) {
+ if ( $ns != NS_SPECIAL && $nt->equals( $this->getTitle() ) && !$nt->hasFragment() ) {
$s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail );
continue;
}
*/
public function areSubpagesAllowed() {
# Some namespaces don't allow subpages
- return $this->nsInfo->hasSubpages( $this->mTitle->getNamespace() );
+ return $this->nsInfo->hasSubpages( $this->getTitle()->getNamespace() );
}
/**
* @private
*/
public function maybeDoSubpageLink( $target, &$text ) {
- return Linker::normalizeSubpageLink( $this->mTitle, $target, $text );
+ return Linker::normalizeSubpageLink( $this->getTitle(), $target, $text );
}
/**
* @param string $index Magic variable identifier as mapped in MagicWordFactory::$mVariableIDs
* @param bool|PPFrame $frame
*
- * @throws MWException
* @return string
*/
public function getVariableValue( $index, $frame = false ) {
- if ( is_null( $this->mTitle ) ) {
- // If no title set, bad things are going to happen
- // later. Title should always be set since this
- // should only be called in the middle of a parse
- // operation (but the unit-tests do funky stuff)
- throw new MWException( __METHOD__ . ' Should only be '
- . ' called while parsing (no title set)' );
- }
-
// Avoid PHP 7.1 warning from passing $this by reference
$parser = $this;
$value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'd' ), true );
break;
case 'pagename':
- $value = wfEscapeWikiText( $this->mTitle->getText() );
+ $value = wfEscapeWikiText( $this->getTitle()->getText() );
break;
case 'pagenamee':
- $value = wfEscapeWikiText( $this->mTitle->getPartialURL() );
+ $value = wfEscapeWikiText( $this->getTitle()->getPartialURL() );
break;
case 'fullpagename':
- $value = wfEscapeWikiText( $this->mTitle->getPrefixedText() );
+ $value = wfEscapeWikiText( $this->getTitle()->getPrefixedText() );
break;
case 'fullpagenamee':
- $value = wfEscapeWikiText( $this->mTitle->getPrefixedURL() );
+ $value = wfEscapeWikiText( $this->getTitle()->getPrefixedURL() );
break;
case 'subpagename':
- $value = wfEscapeWikiText( $this->mTitle->getSubpageText() );
+ $value = wfEscapeWikiText( $this->getTitle()->getSubpageText() );
break;
case 'subpagenamee':
- $value = wfEscapeWikiText( $this->mTitle->getSubpageUrlForm() );
+ $value = wfEscapeWikiText( $this->getTitle()->getSubpageUrlForm() );
break;
case 'rootpagename':
- $value = wfEscapeWikiText( $this->mTitle->getRootText() );
+ $value = wfEscapeWikiText( $this->getTitle()->getRootText() );
break;
case 'rootpagenamee':
$value = wfEscapeWikiText( wfUrlencode( str_replace(
' ',
'_',
- $this->mTitle->getRootText()
+ $this->getTitle()->getRootText()
) ) );
break;
case 'basepagename':
- $value = wfEscapeWikiText( $this->mTitle->getBaseText() );
+ $value = wfEscapeWikiText( $this->getTitle()->getBaseText() );
break;
case 'basepagenamee':
$value = wfEscapeWikiText( wfUrlencode( str_replace(
' ',
'_',
- $this->mTitle->getBaseText()
+ $this->getTitle()->getBaseText()
) ) );
break;
case 'talkpagename':
- if ( $this->mTitle->canHaveTalkPage() ) {
- $talkPage = $this->mTitle->getTalkPage();
+ if ( $this->getTitle()->canHaveTalkPage() ) {
+ $talkPage = $this->getTitle()->getTalkPage();
$value = wfEscapeWikiText( $talkPage->getPrefixedText() );
} else {
$value = '';
}
break;
case 'talkpagenamee':
- if ( $this->mTitle->canHaveTalkPage() ) {
- $talkPage = $this->mTitle->getTalkPage();
+ if ( $this->getTitle()->canHaveTalkPage() ) {
+ $talkPage = $this->getTitle()->getTalkPage();
$value = wfEscapeWikiText( $talkPage->getPrefixedURL() );
} else {
$value = '';
}
break;
case 'subjectpagename':
- $subjPage = $this->mTitle->getSubjectPage();
+ $subjPage = $this->getTitle()->getSubjectPage();
$value = wfEscapeWikiText( $subjPage->getPrefixedText() );
break;
case 'subjectpagenamee':
- $subjPage = $this->mTitle->getSubjectPage();
+ $subjPage = $this->getTitle()->getSubjectPage();
$value = wfEscapeWikiText( $subjPage->getPrefixedURL() );
break;
case 'pageid': // requested in T25427
# Inform the edit saving system that getting the canonical output
# after page insertion requires a parse that used that exact page ID
$this->setOutputFlag( 'vary-page-id', '{{PAGEID}} used' );
- $value = $this->mTitle->getArticleID();
+ $value = $this->getTitle()->getArticleID();
if ( !$value ) {
$value = $this->mOptions->getSpeculativePageId();
if ( $value ) {
$this->svcOptions->get( 'MiserMode' ) &&
!$this->mOptions->getInterfaceMessage() &&
// @TODO: disallow this word on all namespaces
- $this->nsInfo->isContent( $this->mTitle->getNamespace() )
+ $this->nsInfo->isContent( $this->getTitle()->getNamespace() )
) {
// Use a stub result instead of the actual revision ID in order to avoid
// double parses on page save but still allow preview detection (T137900)
break;
case 'namespace':
$value = str_replace( '_', ' ',
- $this->contLang->getNsText( $this->mTitle->getNamespace() ) );
+ $this->contLang->getNsText( $this->getTitle()->getNamespace() ) );
break;
case 'namespacee':
- $value = wfUrlencode( $this->contLang->getNsText( $this->mTitle->getNamespace() ) );
+ $value = wfUrlencode( $this->contLang->getNsText( $this->getTitle()->getNamespace() ) );
break;
case 'namespacenumber':
- $value = $this->mTitle->getNamespace();
+ $value = $this->getTitle()->getNamespace();
break;
case 'talkspace':
- $value = $this->mTitle->canHaveTalkPage()
- ? str_replace( '_', ' ', $this->mTitle->getTalkNsText() )
+ $value = $this->getTitle()->canHaveTalkPage()
+ ? str_replace( '_', ' ', $this->getTitle()->getTalkNsText() )
: '';
break;
case 'talkspacee':
- $value = $this->mTitle->canHaveTalkPage() ? wfUrlencode( $this->mTitle->getTalkNsText() ) : '';
+ $value = $this->getTitle()->canHaveTalkPage()
+ ? wfUrlencode( $this->getTitle()->getTalkNsText() )
+ : '';
break;
case 'subjectspace':
- $value = str_replace( '_', ' ', $this->mTitle->getSubjectNsText() );
+ $value = str_replace( '_', ' ', $this->getTitle()->getSubjectNsText() );
break;
case 'subjectspacee':
- $value = ( wfUrlencode( $this->mTitle->getSubjectNsText() ) );
+ $value = ( wfUrlencode( $this->getTitle()->getSubjectNsText() ) );
break;
case 'currentdayname':
$value = $pageLang->getWeekdayName( (int)MWTimestamp::getInstance( $ts )->format( 'w' ) + 1 );
$relative = $this->maybeDoSubpageLink( $part1, $subpage );
if ( $part1 !== $relative ) {
$part1 = $relative;
- $ns = $this->mTitle->getNamespace();
+ $ns = $this->getTitle()->getNamespace();
}
$title = Title::newFromText( $part1, $ns );
if ( $title ) {
* @param PPFrame $frame The current frame, contains template arguments
* @param string $function Function name
* @param array $args Arguments to the function
- * @throws MWException
* @return array
*/
public function callParserFunction( $frame, $function, array $args = [] ) {
$this->mShowToc = false;
}
if ( isset( $this->mDoubleUnderscores['hiddencat'] )
- && $this->mTitle->getNamespace() == NS_CATEGORY
+ && $this->getTitle()->getNamespace() == NS_CATEGORY
) {
$this->addTrackingCategory( 'hidden-category-category' );
}
# (T10068) Allow control over whether robots index a page.
# __INDEX__ always overrides __NOINDEX__, see T16899
- if ( isset( $this->mDoubleUnderscores['noindex'] ) && $this->mTitle->canUseNoindex() ) {
+ if ( isset( $this->mDoubleUnderscores['noindex'] ) && $this->getTitle()->canUseNoindex() ) {
$this->mOutput->setIndexPolicy( 'noindex' );
$this->addTrackingCategory( 'noindex-category' );
}
- if ( isset( $this->mDoubleUnderscores['index'] ) && $this->mTitle->canUseNoindex() ) {
+ if ( isset( $this->mDoubleUnderscores['index'] ) && $this->getTitle()->canUseNoindex() ) {
$this->mOutput->setIndexPolicy( 'index' );
$this->addTrackingCategory( 'index-category' );
}
* @return bool Whether the addition was successful
*/
public function addTrackingCategory( $msg ) {
- return $this->mOutput->addTrackingCategory( $msg, $this->mTitle );
+ return $this->mOutput->addTrackingCategory( $msg, $this->getTitle() );
}
/**
$toclevel = 0;
$prevtoclevel = 0;
$markerRegex = self::MARKER_PREFIX . "-h-(\d+)-" . self::MARKER_SUFFIX;
- $baseTitleText = $this->mTitle->getPrefixedDBkey();
+ $baseTitleText = $this->getTitle()->getPrefixedDBkey();
$oldType = $this->mOutputType;
$this->setOutputType( self::OT_WIKI );
$frame = $this->getPreprocessor()->newFrame();
$editsectionSection = "T-$sectionIndex";
$editsectionContent = null;
} else {
- $editsectionPage = $this->mTitle->getPrefixedText();
+ $editsectionPage = $this->getTitle()->getPrefixedText();
$editsectionSection = $sectionIndex;
$editsectionContent = $headlineHint;
}
$text = preg_replace( $p4, '[[\\1\\2\\3|\\2]]', $text );
$text = preg_replace( $p3, '[[\\1\\2\\3\\4|\\2]]', $text );
- $t = $this->mTitle->getText();
+ $t = $this->getTitle()->getText();
$m = [];
if ( preg_match( "/^($nc+:|)$tc+?( \\($tc+\\))$/", $t, $m ) ) {
$text = preg_replace( $p2, "[[$m[1]\\1$m[2]|\\1]]", $text );
$ig = ImageGalleryBase::factory( false );
}
- $ig->setContextTitle( $this->mTitle );
+ $ig->setContextTitle( $this->getTitle() );
$ig->setShowBytes( false );
$ig->setShowDimensions( false );
$ig->setShowFilename( false );
*/
protected function setOutputFlag( $flag, $reason ) {
$this->mOutput->setFlag( $flag );
- $name = $this->mTitle->getPrefixedText();
+ $name = $this->getTitle()->getPrefixedText();
$this->logger->debug( __METHOD__ . ": set $flag flag on '$name'; $reason" );
}
}
Util = require( 'wdio-mediawiki/Util' );
describe( 'Page', function () {
- var content,
- name;
+ var content, name, bot;
- before( function () {
+ before( async function () {
// disable VisualEditor welcome dialog
BlankPage.open();
browser.setLocalStorage( 've-beta-welcome-dialog', '1' );
+ bot = await Api.bot();
} );
beforeEach( function () {
it( 'should be re-creatable', function () {
const initialContent = Util.getTestString( 'initialContent-' );
- // create
- browser.call( function () {
- return Api.edit( name, initialContent );
- } );
-
- // delete
- browser.call( function () {
- return Api.delete( name, 'delete prior to recreate' );
+ // create and delete
+ browser.call( async () => {
+ await bot.edit( name, initialContent, 'create for delete' );
+ await bot.delete( name, 'delete prior to recreate' );
} );
- // create
+ // re-create
EditPage.edit( name, content );
// check
it( 'should be editable @daily', function () {
// create
- browser.call( function () {
- return Api.edit( name, content );
+ browser.call( async () => {
+ await bot.edit( name, content, 'create for edit' );
} );
// edit
it( 'should have history @daily', function () {
// create
- browser.call( function () {
- return Api.edit( name, content );
+ browser.call( async () => {
+ await bot.edit( name, content, `created with "${content}"` );
} );
// check
HistoryPage.open( name );
- assert.strictEqual( HistoryPage.comment.getText(), `Created or updated page with "${content}"` );
+ assert.strictEqual( HistoryPage.comment.getText(), `created with "${content}"` );
} );
it( 'should be deletable', function () {
- // login
- UserLoginPage.loginAdmin();
-
// create
- browser.call( function () {
- return Api.edit( name, content );
+ browser.call( async () => {
+ await bot.edit( name, content, 'create for delete' );
} );
+ // login
+ UserLoginPage.loginAdmin();
+
// delete
- DeletePage.delete( name, content + '-deletereason' );
+ DeletePage.delete( name, 'delete reason' );
// check
assert.strictEqual(
} );
it( 'should be restorable', function () {
- // login
- UserLoginPage.loginAdmin();
-
- // create
- browser.call( function () {
- return Api.edit( name, content );
+ // create and delete
+ browser.call( async () => {
+ await bot.edit( name, content, 'create for delete' );
+ await bot.delete( name, 'delete for restore' );
} );
- // delete
- browser.call( function () {
- return Api.delete( name, content + '-deletereason' );
- } );
+ // login
+ UserLoginPage.loginAdmin();
// restore
- RestorePage.restore( name, content + '-restorereason' );
+ RestorePage.restore( name, 'restore reason' );
// check
assert.strictEqual( RestorePage.displayedContent.getText(), name + ' has been restored\nConsult the deletion log for a record of recent deletions and restorations.' );
} );
it( 'should be undoable', function () {
- // create
- browser.call( function () {
- return Api.edit( name, content );
- } );
-
- // edit
let previousRev, undoRev;
- browser.call( function () {
- return Api.edit( name, Util.getTestString( 'editContent-' ) )
- .then( ( response ) => {
- previousRev = response.edit.oldrevid;
- undoRev = response.edit.newrevid;
- } );
+ browser.call( async () => {
+ // create
+ await bot.edit( name, content, 'create to edit and undo' );
+
+ // edit
+ const response = await bot.edit( name, Util.getTestString( 'editContent-' ) );
+ previousRev = response.edit.oldrevid;
+ undoRev = response.edit.newrevid;
} );
UndoPage.undo( name, previousRev, undoRev );
const MWBot = require( 'mwbot' );
-// TODO: Once we require Node 7 or later, we can use async-await.
-
module.exports = {
/**
* Get a logged-in instance of `MWBot` with edit token already set up.
* @param {string} baseUrl - Optional
* @return {Promise<MWBot>}
*/
- bot(
+ async bot(
username = browser.config.mwUser,
password = browser.config.mwPwd,
baseUrl = browser.config.baseUrl
) {
const bot = new MWBot();
- return bot.loginGetEditToken( {
+ await bot.loginGetEditToken( {
apiUrl: `${baseUrl}/api.php`,
username: username,
password: password
- } ).then( function () {
- return bot;
} );
+ return bot;
},
/**
* @param {baseUrl} baseUrl - Optional
* @return {Object} Promise for API action=edit response data.
*/
- edit( title,
+ async edit( title,
content,
username = browser.config.mwUser,
password = browser.config.mwPwd,
baseUrl = browser.config.baseUrl
) {
- return this.bot( username, password, baseUrl )
- .then( function ( bot ) {
- return bot.edit( title, content, `Created or updated page with "${content}"` );
- } );
+ const bot = await this.bot( username, password, baseUrl );
+ return await bot.edit( title, content, `Created or updated page with "${content}"` );
},
/**
* @param {string} reason
* @return {Object} Promise for API action=delete response data.
*/
- delete( title, reason ) {
- return this.bot()
- .then( function ( bot ) {
- return bot.delete( title, reason );
- } );
+ async delete( title, reason ) {
+ const bot = await this.bot();
+ return await bot.delete( title, reason );
},
/**
* @param {string} password
* @return {Object} Promise for API action=createaccount response data.
*/
- createAccount( username, password ) {
+ async createAccount( username, password ) {
const bot = new MWBot();
// Log in as admin
- return bot.loginGetCreateaccountToken( {
+ await bot.loginGetCreateaccountToken( {
apiUrl: `${browser.config.baseUrl}/api.php`,
username: browser.config.mwUser,
password: browser.config.mwPwd
- } ).then( function () {
- // Create the new account
- return bot.request( {
- action: 'createaccount',
- createreturnurl: browser.config.baseUrl,
- createtoken: bot.createaccountToken,
- username: username,
- password: password,
- retype: password
- } );
+ } );
+ // Create the new account
+ return await bot.request( {
+ action: 'createaccount',
+ createreturnurl: browser.config.baseUrl,
+ createtoken: bot.createaccountToken,
+ username: username,
+ password: password,
+ retype: password
} );
},
* @param {string} [expiry] default is not set. For format see API docs
* @return {Object} Promise for API action=block response data.
*/
- blockUser( username, expiry ) {
- return this.bot()
- .then( function ( bot ) {
- // block user. default = admin
- return bot.request( {
- action: 'block',
- user: username || browser.config.mwUser,
- reason: 'browser test',
- token: bot.editToken,
- expiry
- } );
- } );
+ async blockUser( username, expiry ) {
+ const bot = await this.bot();
+ // block user. default = admin
+ return await bot.request( {
+ action: 'block',
+ user: username || browser.config.mwUser,
+ reason: 'browser test',
+ token: bot.editToken,
+ expiry
+ } );
},
/**
* @param {string} [username] defaults to user making the request
* @return {Object} Promise for API action=unblock response data.
*/
- unblockUser( username ) {
- return this.bot()
- .then( function ( bot ) {
- // unblock user. default = admin
- return bot.request( {
- action: 'unblock',
- user: username || browser.config.mwUser,
- reason: 'browser test done',
- token: bot.editToken
- } );
- } );
+ async unblockUser( username ) {
+ const bot = await this.bot();
+ // unblock user. default = admin
+ return await bot.request( {
+ action: 'unblock',
+ user: username || browser.config.mwUser,
+ reason: 'browser test done',
+ token: bot.editToken
+ } );
}
};