// Backwards compatibility for old signature ($command, $title, $params)
$title = $params;
$params = func_num_args() >= 3 ? func_get_arg( 2 ) : [];
+ } elseif ( isset( $params['namespace'] ) && isset( $params['title'] ) ) {
+ // Handle job classes that take title as constructor parameter.
+ // If a newer classes like GenericParameterJob uses these parameters,
+ // then this happens in Job::__construct instead.
+ $title = Title::makeTitle( $params['namespace'], $params['title'] );
} else {
- $title = ( isset( $params['namespace'] ) && isset( $params['title'] ) )
- ? Title::makeTitle( $params['namespace'], $params['title'] )
- : Title::makeTitle( NS_SPECIAL, '' );
+ // Default title for job classes not implementing GenericParameterJob.
+ // This must be a valid title because it not directly passed to
+ // our Job constructor, but rather it's subclasses which may expect
+ // to be able to use it.
+ $title = Title::makeTitle( NS_SPECIAL, 'Blankpage' );
}
- $params = is_array( $params ) ? $params : []; // sanity
-
if ( isset( $wgJobClasses[$command] ) ) {
$handler = $wgJobClasses[$command];
// Backwards compatibility for old signature ($command, $title, $params)
$title = $params;
$params = func_num_args() >= 3 ? func_get_arg( 2 ) : [];
- $params = is_array( $params ) ? $params : []; // sanity
- // Set namespace/title params if both are missing and this is not a dummy title
- if (
- $title->getDBkey() !== '' &&
- !isset( $params['namespace'] ) &&
- !isset( $params['title'] )
- ) {
- $params['namespace'] = $title->getNamespace();
- $params['title'] = $title->getDBKey();
- // Note that JobQueue classes will prefer the parameters over getTitle()
- $this->title = $title;
- }
+ } else {
+ // Newer jobs may choose to not have a top-level title (e.g. GenericParameterJob)
+ $title = null;
+ }
+
+ if ( !is_array( $params ) ) {
+ throw new InvalidArgumentException( '$params must be an array' );
+ }
+
+ if (
+ $title &&
+ !isset( $params['namespace'] ) &&
+ !isset( $params['title'] )
+ ) {
+ // When constructing this class for submitting to the queue,
+ // normalise the $title arg of old job classes as part of $params.
+ $params['namespace'] = $title->getNamespace();
+ $params['title'] = $title->getDBKey();
}
$this->command = $command;
$this->params = $params + [ 'requestId' => WebRequest::getRequestId() ];
+
if ( $this->title === null ) {
+ // Set this field for access via getTitle().
$this->title = ( isset( $params['namespace'] ) && isset( $params['title'] ) )
? Title::makeTitle( $params['namespace'], $params['title'] )
+ // GenericParameterJob classes without namespace/title params
+ // should not use getTitle(). Set an invalid title as placeholder.
: Title::makeTitle( NS_SPECIAL, '' );
}
}
$requestId = 'requestId=' . WebRequest::getRequestId();
return [
- [
- $this->getMockJob( false ),
- 'someCommand Special: ' . $requestId
- ],
[
$this->getMockJob( [ 'key' => 'val' ] ),
'someCommand Special: key=val ' . $requestId
}
public function getMockJob( $params ) {
- $title = new Title();
$mock = $this->getMockForAbstractClass(
Job::class,
- [ 'someCommand', $title, $params ],
+ [ 'someCommand', $params ],
'SomeJob'
);
return $mock;
}
+ /**
+ * @covers Job::__construct()
+ */
+ public function testInvalidParamsArgument() {
+ $params = false;
+ $this->setExpectedException( InvalidArgumentException::class, '$params must be an array' );
+ $job = $this->getMockJob( $params );
+ }
+
/**
* @dataProvider provideTestJobFactory
*
*/
public function testJobSignatureTitleBased() {
$testPage = Title::makeTitle( NS_PROJECT, 'x' );
- $blankTitle = Title::makeTitle( NS_SPECIAL, '' );
+ $blankPage = Title::makeTitle( NS_SPECIAL, 'Blankpage' );
$params = [ 'z' => 1, 'causeAction' => 'unknown', 'causeAgent' => 'unknown' ];
$paramsWithTitle = $params + [ 'namespace' => NS_PROJECT, 'title' => 'x' ];
+ $paramsWithBlankpage = $params + [ 'namespace' => NS_SPECIAL, 'title' => 'Blankpage' ];
$job = new RefreshLinksJob( $testPage, $params );
$this->assertEquals( $testPage->getPrefixedText(), $job->getTitle()->getPrefixedText() );
- $this->assertSame( $testPage, $job->getTitle() );
+ $this->assertTrue( $testPage->equals( $job->getTitle() ) );
$this->assertJobParamsMatch( $job, $paramsWithTitle );
- $this->assertSame( $testPage, $job->getTitle() );
$job = Job::factory( 'refreshLinks', $testPage, $params );
$this->assertEquals( $testPage->getPrefixedText(), $job->getTitle()->getPrefixedText() );
$this->assertJobParamsMatch( $job, $paramsWithTitle );
$job = Job::factory( 'refreshLinks', $params );
- $this->assertTrue( $blankTitle->equals( $job->getTitle() ) );
- $this->assertJobParamsMatch( $job, $params );
+ $this->assertTrue( $blankPage->equals( $job->getTitle() ) );
+ $this->assertJobParamsMatch( $job, $paramsWithBlankpage );
}
/**