// parameters either. We do allow the 'rawcontinue' and 'indexpageids'
// parameters since frameworks might add these unconditionally and they
// can't expose anything here.
+ $allowedParams = [ 'rawcontinue' => 1, 'indexpageids' => 1 ];
$this->mParams = $this->extractRequestParams();
- $params = array_filter(
- array_diff_key(
- $this->mParams + $this->getPageSet()->extractRequestParams(),
- [ 'rawcontinue' => 1, 'indexpageids' => 1 ]
- )
- );
- if ( array_keys( $params ) !== [ 'meta' ] ) {
- return true;
+ $request = $this->getRequest();
+ foreach ( $this->mParams + $this->getPageSet()->extractRequestParams() as $param => $value ) {
+ $needed = $param === 'meta';
+ if ( !isset( $allowedParams[$param] ) && $request->getCheck( $param ) !== $needed ) {
+ return true;
+ }
}
// Ask each module if it requires read mode. Any true => this returns
// This response field contains an XML document even if no pages were exported
$this->assertNotContains( $title->getPrefixedText(), $data[0]['query']['export'] );
}
+
+ public function testIsReadMode() {
+ $api = new ApiMain(
+ new FauxRequest( [ 'action' => 'query', 'meta' => 'tokens', 'type' => 'login' ] )
+ );
+ $queryApi = new ApiQuery( $api, 'query' );
+ $this->assertFalse( $queryApi->isReadMode(),
+ 'isReadMode() => false when meta=tokens is the only module' );
+
+ $api = new ApiMain( new FauxRequest( [
+ 'action' => 'query', 'meta' => 'tokens', 'type' => 'login', 'rawcontinue' => 1,
+ 'indexpageids' => 1
+ ] )
+ );
+ $queryApi = new ApiQuery( $api, 'query' );
+ $this->assertFalse( $queryApi->isReadMode(),
+ 'rawcontinue and indexpageids are also allowed' );
+
+ $api = new ApiMain(
+ new FauxRequest( [ 'action' => 'query', 'meta' => 'tokens|siteinfo', 'type' => 'login' ] )
+ );
+ $queryApi = new ApiQuery( $api, 'query' );
+ $this->assertTrue( $queryApi->isReadMode(),
+ 'isReadMode() => true when other meta modules are present' );
+
+ $api = new ApiMain( new FauxRequest( [
+ 'action' => 'query', 'meta' => 'tokens', 'type' => 'login', 'list' => 'allpages'
+ ] ) );
+ $queryApi = new ApiQuery( $api, 'query' );
+ $this->assertTrue( $queryApi->isReadMode(),
+ 'isReadMode() => true when other modules are present' );
+
+ $api = new ApiMain( new FauxRequest( [
+ 'action' => 'query', 'meta' => 'tokens', 'type' => 'login', 'titles' => 'Foo'
+ ] ) );
+ $queryApi = new ApiQuery( $api, 'query' );
+ $this->assertTrue( $queryApi->isReadMode(),
+ 'isReadMode() => true when other ApiQuery parameters are present' );
+
+ $api = new ApiMain( new FauxRequest( [ 'action' => 'query' ] ) );
+ $queryApi = new ApiQuery( $api, 'query' );
+ $this->assertTrue( $queryApi->isReadMode(),
+ 'isReadMode() => true when no modules are requested' );
+ }
}