MediaWiki  1.33.0
TitleTest.php
Go to the documentation of this file.
1 <?php
2 
5 
11  protected function setUp() {
12  parent::setUp();
13 
14  $this->setMwGlobals( [
15  'wgAllowUserJs' => false,
16  'wgDefaultLanguageVariant' => false,
17  'wgMetaNamespace' => 'Project',
18  ] );
19  $this->setUserLang( 'en' );
20  $this->setContentLang( 'en' );
21  }
22 
26  public function testLegalChars() {
27  $titlechars = Title::legalChars();
28 
29  foreach ( range( 1, 255 ) as $num ) {
30  $chr = chr( $num );
31  if ( strpos( "#[]{}<>|", $chr ) !== false || preg_match( "/[\\x00-\\x1f\\x7f]/", $chr ) ) {
32  $this->assertFalse(
33  (bool)preg_match( "/[$titlechars]/", $chr ),
34  "chr($num) = $chr is not a valid titlechar"
35  );
36  } else {
37  $this->assertTrue(
38  (bool)preg_match( "/[$titlechars]/", $chr ),
39  "chr($num) = $chr is a valid titlechar"
40  );
41  }
42  }
43  }
44 
45  public static function provideValidSecureAndSplit() {
46  return [
47  [ 'Sandbox' ],
48  [ 'A "B"' ],
49  [ 'A \'B\'' ],
50  [ '.com' ],
51  [ '~' ],
52  [ '#' ],
53  [ '"' ],
54  [ '\'' ],
55  [ 'Talk:Sandbox' ],
56  [ 'Talk:Foo:Sandbox' ],
57  [ 'File:Example.svg' ],
58  [ 'File_talk:Example.svg' ],
59  [ 'Foo/.../Sandbox' ],
60  [ 'Sandbox/...' ],
61  [ 'A~~' ],
62  [ ':A' ],
63  // Length is 256 total, but only title part matters
64  [ 'Category:' . str_repeat( 'x', 248 ) ],
65  [ str_repeat( 'x', 252 ) ],
66  // interwiki prefix
67  [ 'localtestiw: #anchor' ],
68  [ 'localtestiw:' ],
69  [ 'localtestiw:foo' ],
70  [ 'localtestiw: foo # anchor' ],
71  [ 'localtestiw: Talk: Sandbox # anchor' ],
72  [ 'remotetestiw:' ],
73  [ 'remotetestiw: Talk: # anchor' ],
74  [ 'remotetestiw: #bar' ],
75  [ 'remotetestiw: Talk:' ],
76  [ 'remotetestiw: Talk: Foo' ],
77  [ 'localtestiw:remotetestiw:' ],
78  [ 'localtestiw:remotetestiw:foo' ]
79  ];
80  }
81 
82  public static function provideInvalidSecureAndSplit() {
83  return [
84  [ '', 'title-invalid-empty' ],
85  [ ':', 'title-invalid-empty' ],
86  [ '__ __', 'title-invalid-empty' ],
87  [ ' __ ', 'title-invalid-empty' ],
88  // Bad characters forbidden regardless of wgLegalTitleChars
89  [ 'A [ B', 'title-invalid-characters' ],
90  [ 'A ] B', 'title-invalid-characters' ],
91  [ 'A { B', 'title-invalid-characters' ],
92  [ 'A } B', 'title-invalid-characters' ],
93  [ 'A < B', 'title-invalid-characters' ],
94  [ 'A > B', 'title-invalid-characters' ],
95  [ 'A | B', 'title-invalid-characters' ],
96  [ "A \t B", 'title-invalid-characters' ],
97  [ "A \n B", 'title-invalid-characters' ],
98  // URL encoding
99  [ 'A%20B', 'title-invalid-characters' ],
100  [ 'A%23B', 'title-invalid-characters' ],
101  [ 'A%2523B', 'title-invalid-characters' ],
102  // XML/HTML character entity references
103  // Note: Commented out because they are not marked invalid by the PHP test as
104  // Title::newFromText runs Sanitizer::decodeCharReferencesAndNormalize first.
105  // 'A &eacute; B',
106  // 'A &#233; B',
107  // 'A &#x00E9; B',
108  // Subject of NS_TALK does not roundtrip to NS_MAIN
109  [ 'Talk:File:Example.svg', 'title-invalid-talk-namespace' ],
110  // Directory navigation
111  [ '.', 'title-invalid-relative' ],
112  [ '..', 'title-invalid-relative' ],
113  [ './Sandbox', 'title-invalid-relative' ],
114  [ '../Sandbox', 'title-invalid-relative' ],
115  [ 'Foo/./Sandbox', 'title-invalid-relative' ],
116  [ 'Foo/../Sandbox', 'title-invalid-relative' ],
117  [ 'Sandbox/.', 'title-invalid-relative' ],
118  [ 'Sandbox/..', 'title-invalid-relative' ],
119  // Tilde
120  [ 'A ~~~ Name', 'title-invalid-magic-tilde' ],
121  [ 'A ~~~~ Signature', 'title-invalid-magic-tilde' ],
122  [ 'A ~~~~~ Timestamp', 'title-invalid-magic-tilde' ],
123  // Length
124  [ str_repeat( 'x', 256 ), 'title-invalid-too-long' ],
125  // Namespace prefix without actual title
126  [ 'Talk:', 'title-invalid-empty' ],
127  [ 'Talk:#', 'title-invalid-empty' ],
128  [ 'Category: ', 'title-invalid-empty' ],
129  [ 'Category: #bar', 'title-invalid-empty' ],
130  // interwiki prefix
131  [ 'localtestiw: Talk: # anchor', 'title-invalid-empty' ],
132  [ 'localtestiw: Talk:', 'title-invalid-empty' ]
133  ];
134  }
135 
136  private function secureAndSplitGlobals() {
137  $this->setMwGlobals( [
138  'wgLocalInterwikis' => [ 'localtestiw' ],
139  'wgHooks' => [
140  'InterwikiLoadPrefix' => [
141  function ( $prefix, &$data ) {
142  if ( $prefix === 'localtestiw' ) {
143  $data = [ 'iw_url' => 'localtestiw' ];
144  } elseif ( $prefix === 'remotetestiw' ) {
145  $data = [ 'iw_url' => 'remotetestiw' ];
146  }
147  return false;
148  }
149  ]
150  ]
151  ] );
152 
153  // Reset TitleParser since we modified $wgLocalInterwikis
154  $this->setService( 'TitleParser', new MediaWikiTitleCodec(
155  Language::factory( 'en' ),
156  new GenderCache(),
157  [ 'localtestiw' ]
158  ) );
159  }
160 
167  public function testSecureAndSplitValid( $text ) {
168  $this->secureAndSplitGlobals();
169  $this->assertInstanceOf( Title::class, Title::newFromText( $text ), "Valid: $text" );
170  }
171 
178  public function testSecureAndSplitInvalid( $text, $expectedErrorMessage ) {
179  $this->secureAndSplitGlobals();
180  try {
181  Title::newFromTextThrow( $text ); // should throw
182  $this->assertTrue( false, "Invalid: $text" );
183  } catch ( MalformedTitleException $ex ) {
184  $this->assertEquals( $expectedErrorMessage, $ex->getErrorMessage(), "Invalid: $text" );
185  }
186  }
187 
188  public static function provideConvertByteClassToUnicodeClass() {
189  return [
190  [
191  ' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+',
192  ' %!"$&\'()*,\\-./0-9:;=?@A-Z\\\\\\^_`a-z~+\\u0080-\\uFFFF',
193  ],
194  [
195  'QWERTYf-\\xFF+',
196  'QWERTYf-\\x7F+\\u0080-\\uFFFF',
197  ],
198  [
199  'QWERTY\\x66-\\xFD+',
200  'QWERTYf-\\x7F+\\u0080-\\uFFFF',
201  ],
202  [
203  'QWERTYf-y+',
204  'QWERTYf-y+',
205  ],
206  [
207  'QWERTYf-\\x80+',
208  'QWERTYf-\\x7F+\\u0080-\\uFFFF',
209  ],
210  [
211  'QWERTY\\x66-\\x80+\\x23',
212  'QWERTYf-\\x7F+#\\u0080-\\uFFFF',
213  ],
214  [
215  'QWERTY\\x66-\\x80+\\xD3',
216  'QWERTYf-\\x7F+\\u0080-\\uFFFF',
217  ],
218  [
219  '\\\\\\x99',
220  '\\\\\\u0080-\\uFFFF',
221  ],
222  [
223  '-\\x99',
224  '\\-\\u0080-\\uFFFF',
225  ],
226  [
227  'QWERTY\\-\\x99',
228  'QWERTY\\-\\u0080-\\uFFFF',
229  ],
230  [
231  '\\\\x99',
232  '\\\\x99',
233  ],
234  [
235  'A-\\x9F',
236  'A-\\x7F\\u0080-\\uFFFF',
237  ],
238  [
239  '\\x66-\\x77QWERTY\\x88-\\x91FXZ',
240  'f-wQWERTYFXZ\\u0080-\\uFFFF',
241  ],
242  [
243  '\\x66-\\x99QWERTY\\xAA-\\xEEFXZ',
244  'f-\\x7FQWERTYFXZ\\u0080-\\uFFFF',
245  ],
246  ];
247  }
248 
253  public function testConvertByteClassToUnicodeClass( $byteClass, $unicodeClass ) {
254  $this->assertEquals( $unicodeClass, Title::convertByteClassToUnicodeClass( $byteClass ) );
255  }
256 
261  public function testFixSpecialNameRetainsParameter( $text, $expectedParam ) {
262  $title = Title::newFromText( $text );
263  $fixed = $title->fixSpecialName();
264  $stuff = explode( '/', $fixed->getDBkey(), 2 );
265  if ( count( $stuff ) == 2 ) {
266  $par = $stuff[1];
267  } else {
268  $par = null;
269  }
270  $this->assertEquals(
271  $expectedParam,
272  $par,
273  "T33100 regression check: Title->fixSpecialName() should preserve parameter"
274  );
275  }
276 
278  return [
279  [ 'Special:Version', null ],
280  [ 'Special:Version/', '' ],
281  [ 'Special:Version/param', 'param' ],
282  ];
283  }
284 
294  public function testIsValidMoveOperation( $source, $target, $expected ) {
295  $this->setMwGlobals( 'wgContentHandlerUseDB', false );
297  $nt = Title::newFromText( $target );
298  $errors = $title->isValidMoveOperation( $nt, false );
299  if ( $expected === true ) {
300  $this->assertTrue( $errors );
301  } else {
302  $errors = $this->flattenErrorsArray( $errors );
303  foreach ( (array)$expected as $error ) {
304  $this->assertContains( $error, $errors );
305  }
306  }
307  }
308 
309  public static function provideTestIsValidMoveOperation() {
310  return [
311  // for Title::isValidMoveOperation
312  [ 'Some page', '', 'badtitletext' ],
313  [ 'Test', 'Test', 'selfmove' ],
314  [ 'Special:FooBar', 'Test', 'immobile-source-namespace' ],
315  [ 'Test', 'Special:FooBar', 'immobile-target-namespace' ],
316  [ 'MediaWiki:Common.js', 'Help:Some wikitext page', 'bad-target-model' ],
317  [ 'Page', 'File:Test.jpg', 'nonfile-cannot-move-to-file' ],
318  [ 'File:Test.jpg', 'Page', 'imagenocrossnamespace' ],
319  ];
320  }
321 
333  public function testWgWhitelistReadRegexp( $whitelistRegexp, $source, $action, $expected ) {
334  // $wgWhitelistReadRegexp must be an array. Since the provided test cases
335  // usually have only one regex, it is more concise to write the lonely regex
336  // as a string. Thus we cast to an array() to honor $wgWhitelistReadRegexp
337  // type requisite.
338  if ( is_string( $whitelistRegexp ) ) {
339  $whitelistRegexp = [ $whitelistRegexp ];
340  }
341 
342  $this->setMwGlobals( [
343  // So User::isEveryoneAllowed( 'read' ) === false
344  'wgGroupPermissions' => [ '*' => [ 'read' => false ] ],
345  'wgWhitelistRead' => [ 'some random non sense title' ],
346  'wgWhitelistReadRegexp' => $whitelistRegexp,
347  ] );
348 
350 
351  // New anonymous user with no rights
352  $user = new User;
353  $user->mRights = [];
354  $errors = $title->userCan( $action, $user );
355 
356  if ( is_bool( $expected ) ) {
357  # Forge the assertion message depending on the assertion expectation
358  $allowableness = $expected
359  ? " should be allowed"
360  : " should NOT be allowed";
361  $this->assertEquals(
362  $expected,
363  $errors,
364  "User action '$action' on [[$source]] $allowableness."
365  );
366  } else {
367  $errors = $this->flattenErrorsArray( $errors );
368  foreach ( (array)$expected as $error ) {
369  $this->assertContains( $error, $errors );
370  }
371  }
372  }
373 
377  public function dataWgWhitelistReadRegexp() {
378  $ALLOWED = true;
379  $DISALLOWED = false;
380 
381  return [
382  // Everything, if this doesn't work, we're really in trouble
383  [ '/.*/', 'Main_Page', 'read', $ALLOWED ],
384  [ '/.*/', 'Main_Page', 'edit', $DISALLOWED ],
385 
386  // We validate against the title name, not the db key
387  [ '/^Main_Page$/', 'Main_Page', 'read', $DISALLOWED ],
388  // Main page
389  [ '/^Main/', 'Main_Page', 'read', $ALLOWED ],
390  [ '/^Main.*/', 'Main_Page', 'read', $ALLOWED ],
391  // With spaces
392  [ '/Mic\sCheck/', 'Mic Check', 'read', $ALLOWED ],
393  // Unicode multibyte
394  // ...without unicode modifier
395  [ '/Unicode Test . Yes/', 'Unicode Test Ñ Yes', 'read', $DISALLOWED ],
396  // ...with unicode modifier
397  [ '/Unicode Test . Yes/u', 'Unicode Test Ñ Yes', 'read', $ALLOWED ],
398  // Case insensitive
399  [ '/MiC ChEcK/', 'mic check', 'read', $DISALLOWED ],
400  [ '/MiC ChEcK/i', 'mic check', 'read', $ALLOWED ],
401 
402  // From DefaultSettings.php:
403  [ "@^UsEr.*@i", 'User is banned', 'read', $ALLOWED ],
404  [ "@^UsEr.*@i", 'User:John Doe', 'read', $ALLOWED ],
405 
406  // With namespaces:
407  [ '/^Special:NewPages$/', 'Special:NewPages', 'read', $ALLOWED ],
408  [ null, 'Special:Newpages', 'read', $DISALLOWED ],
409 
410  ];
411  }
412 
413  public function flattenErrorsArray( $errors ) {
414  $result = [];
415  foreach ( $errors as $error ) {
416  $result[] = $error[0];
417  }
418 
419  return $result;
420  }
421 
426  public function testGetPageViewLanguage( $expected, $titleText, $contLang,
427  $lang, $variant, $msg = ''
428  ) {
429  // Setup environnement for this test
430  $this->setMwGlobals( [
431  'wgDefaultLanguageVariant' => $variant,
432  'wgAllowUserJs' => true,
433  ] );
434  $this->setUserLang( $lang );
435  $this->setContentLang( $contLang );
436 
437  $title = Title::newFromText( $titleText );
438  $this->assertInstanceOf( Title::class, $title,
439  "Test must be passed a valid title text, you gave '$titleText'"
440  );
441  $this->assertEquals( $expected,
442  $title->getPageViewLanguage()->getCode(),
443  $msg
444  );
445  }
446 
447  public static function provideGetPageViewLanguage() {
448  # Format:
449  # - expected
450  # - Title name
451  # - content language (expected in most cases)
452  # - wgLang (on some specific pages)
453  # - wgDefaultLanguageVariant
454  # - Optional message
455  return [
456  [ 'fr', 'Help:I_need_somebody', 'fr', 'fr', false ],
457  [ 'es', 'Help:I_need_somebody', 'es', 'zh-tw', false ],
458  [ 'zh', 'Help:I_need_somebody', 'zh', 'zh-tw', false ],
459 
460  [ 'es', 'Help:I_need_somebody', 'es', 'zh-tw', 'zh-cn' ],
461  [ 'es', 'MediaWiki:About', 'es', 'zh-tw', 'zh-cn' ],
462  [ 'es', 'MediaWiki:About/', 'es', 'zh-tw', 'zh-cn' ],
463  [ 'de', 'MediaWiki:About/de', 'es', 'zh-tw', 'zh-cn' ],
464  [ 'en', 'MediaWiki:Common.js', 'es', 'zh-tw', 'zh-cn' ],
465  [ 'en', 'MediaWiki:Common.css', 'es', 'zh-tw', 'zh-cn' ],
466  [ 'en', 'User:JohnDoe/Common.js', 'es', 'zh-tw', 'zh-cn' ],
467  [ 'en', 'User:JohnDoe/Monobook.css', 'es', 'zh-tw', 'zh-cn' ],
468 
469  [ 'zh-cn', 'Help:I_need_somebody', 'zh', 'zh-tw', 'zh-cn' ],
470  [ 'zh', 'MediaWiki:About', 'zh', 'zh-tw', 'zh-cn' ],
471  [ 'zh', 'MediaWiki:About/', 'zh', 'zh-tw', 'zh-cn' ],
472  [ 'de', 'MediaWiki:About/de', 'zh', 'zh-tw', 'zh-cn' ],
473  [ 'zh-cn', 'MediaWiki:About/zh-cn', 'zh', 'zh-tw', 'zh-cn' ],
474  [ 'zh-tw', 'MediaWiki:About/zh-tw', 'zh', 'zh-tw', 'zh-cn' ],
475  [ 'en', 'MediaWiki:Common.js', 'zh', 'zh-tw', 'zh-cn' ],
476  [ 'en', 'MediaWiki:Common.css', 'zh', 'zh-tw', 'zh-cn' ],
477  [ 'en', 'User:JohnDoe/Common.js', 'zh', 'zh-tw', 'zh-cn' ],
478  [ 'en', 'User:JohnDoe/Monobook.css', 'zh', 'zh-tw', 'zh-cn' ],
479 
480  [ 'zh-tw', 'Special:NewPages', 'es', 'zh-tw', 'zh-cn' ],
481  [ 'zh-tw', 'Special:NewPages', 'zh', 'zh-tw', 'zh-cn' ],
482 
483  ];
484  }
485 
490  public function testGetBaseText( $title, $expected, $msg = '' ) {
492  $this->assertEquals( $expected,
493  $title->getBaseText(),
494  $msg
495  );
496  }
497 
498  public static function provideBaseTitleCases() {
499  return [
500  # Title, expected base, optional message
501  [ 'User:John_Doe/subOne/subTwo', 'John Doe/subOne' ],
502  [ 'User:Foo/Bar/Baz', 'Foo/Bar' ],
503  ];
504  }
505 
510  public function testGetRootText( $title, $expected, $msg = '' ) {
512  $this->assertEquals( $expected,
513  $title->getRootText(),
514  $msg
515  );
516  }
517 
518  public static function provideRootTitleCases() {
519  return [
520  # Title, expected base, optional message
521  [ 'User:John_Doe/subOne/subTwo', 'John Doe' ],
522  [ 'User:Foo/Bar/Baz', 'Foo' ],
523  ];
524  }
525 
531  public function testGetSubpageText( $title, $expected, $msg = '' ) {
533  $this->assertEquals( $expected,
534  $title->getSubpageText(),
535  $msg
536  );
537  }
538 
539  public static function provideSubpageTitleCases() {
540  return [
541  # Title, expected base, optional message
542  [ 'User:John_Doe/subOne/subTwo', 'subTwo' ],
543  [ 'User:John_Doe/subOne', 'subOne' ],
544  ];
545  }
546 
547  public static function provideNewFromTitleValue() {
548  return [
549  [ new TitleValue( NS_MAIN, 'Foo' ) ],
550  [ new TitleValue( NS_MAIN, 'Foo', 'bar' ) ],
551  [ new TitleValue( NS_USER, 'Hansi_Maier' ) ],
552  ];
553  }
554 
561 
562  $dbkey = str_replace( ' ', '_', $value->getText() );
563  $this->assertEquals( $dbkey, $title->getDBkey() );
564  $this->assertEquals( $value->getNamespace(), $title->getNamespace() );
565  $this->assertEquals( $value->getFragment(), $title->getFragment() );
566  }
567 
574 
575  $dbkey = str_replace( ' ', '_', $value->getText() );
576  $this->assertEquals( $dbkey, $title->getDBkey() );
577  $this->assertEquals( $value->getNamespace(), $title->getNamespace() );
578  $this->assertEquals( $value->getFragment(), $title->getFragment() );
579  }
580 
584  public function testNewFromLinkTarget_clone() {
585  $title = Title::newFromText( __METHOD__ );
586  $this->assertSame( $title, Title::newFromLinkTarget( $title ) );
587 
588  // The Title::NEW_CLONE flag should ensure that a fresh instance is returned.
590  $this->assertNotSame( $title, $clone );
591  $this->assertTrue( $clone->equals( $title ) );
592  }
593 
594  public static function provideGetTitleValue() {
595  return [
596  [ 'Foo' ],
597  [ 'Foo#bar' ],
598  [ 'User:Hansi_Maier' ],
599  ];
600  }
601 
606  public function testGetTitleValue( $text ) {
607  $title = Title::newFromText( $text );
608  $value = $title->getTitleValue();
609 
610  $dbkey = str_replace( ' ', '_', $value->getText() );
611  $this->assertEquals( $title->getDBkey(), $dbkey );
612  $this->assertEquals( $title->getNamespace(), $value->getNamespace() );
613  $this->assertEquals( $title->getFragment(), $value->getFragment() );
614  }
615 
616  public static function provideGetFragment() {
617  return [
618  [ 'Foo', '' ],
619  [ 'Foo#bar', 'bar' ],
620  [ 'Foo#bär', 'bär' ],
621 
622  // Inner whitespace is normalized
623  [ 'Foo#bar_bar', 'bar bar' ],
624  [ 'Foo#bar bar', 'bar bar' ],
625  [ 'Foo#bar bar', 'bar bar' ],
626 
627  // Leading whitespace is kept, trailing whitespace is trimmed.
628  // XXX: Is this really want we want?
629  [ 'Foo#_bar_bar_', ' bar bar' ],
630  [ 'Foo# bar bar ', ' bar bar' ],
631  ];
632  }
633 
641  public function testGetFragment( $full, $fragment ) {
642  $title = Title::newFromText( $full );
643  $this->assertEquals( $fragment, $title->getFragment() );
644  }
645 
652  public function testIsAlwaysKnown( $page, $isKnown ) {
653  $title = Title::newFromText( $page );
654  $this->assertEquals( $isKnown, $title->isAlwaysKnown() );
655  }
656 
657  public static function provideIsAlwaysKnown() {
658  return [
659  [ 'Some nonexistent page', false ],
660  [ 'UTPage', false ],
661  [ '#test', true ],
662  [ 'Special:BlankPage', true ],
663  [ 'Special:SomeNonexistentSpecialPage', false ],
664  [ 'MediaWiki:Parentheses', true ],
665  [ 'MediaWiki:Some nonexistent message', false ],
666  ];
667  }
668 
675  public function testIsValid( Title $title, $isValid ) {
676  $this->assertEquals( $isValid, $title->isValid(), $title->getPrefixedText() );
677  }
678 
679  public static function provideIsValid() {
680  return [
681  [ Title::makeTitle( NS_MAIN, '' ), false ],
682  [ Title::makeTitle( NS_MAIN, '<>' ), false ],
683  [ Title::makeTitle( NS_MAIN, '|' ), false ],
684  [ Title::makeTitle( NS_MAIN, '#' ), false ],
685  [ Title::makeTitle( NS_MAIN, 'Test' ), true ],
686  [ Title::makeTitle( -33, 'Test' ), false ],
687  [ Title::makeTitle( 77663399, 'Test' ), false ],
688  ];
689  }
690 
694  public function testIsAlwaysKnownOnInterwiki() {
695  $title = Title::makeTitle( NS_MAIN, 'Interwiki link', '', 'externalwiki' );
696  $this->assertTrue( $title->isAlwaysKnown() );
697  }
698 
702  public function testExists() {
703  $title = Title::makeTitle( NS_PROJECT, 'New page' );
704  $linkCache = MediaWikiServices::getInstance()->getLinkCache();
705 
706  $article = new Article( $title );
707  $page = $article->getPage();
708  $page->doEditContent( new WikitextContent( 'Some [[link]]' ), 'summary' );
709 
710  // Tell Title it doesn't know whether it exists
711  $title->mArticleID = -1;
712 
713  // Tell the link cache it doesn't exists when it really does
714  $linkCache->clearLink( $title );
715  $linkCache->addBadLinkObj( $title );
716 
717  $this->assertEquals(
718  false,
719  $title->exists(),
720  'exists() should rely on link cache unless GAID_FOR_UPDATE is used'
721  );
722  $this->assertEquals(
723  true,
724  $title->exists( Title::GAID_FOR_UPDATE ),
725  'exists() should re-query database when GAID_FOR_UPDATE is used'
726  );
727  }
728 
729  public function provideCanHaveTalkPage() {
730  return [
731  'User page has talk page' => [
732  Title::makeTitle( NS_USER, 'Jane' ), true
733  ],
734  'Talke page has talk page' => [
735  Title::makeTitle( NS_TALK, 'Foo' ), true
736  ],
737  'Special page cannot have talk page' => [
738  Title::makeTitle( NS_SPECIAL, 'Thing' ), false
739  ],
740  'Virtual namespace cannot have talk page' => [
741  Title::makeTitle( NS_MEDIA, 'Kitten.jpg' ), false
742  ],
743  ];
744  }
745 
753  public function testCanHaveTalkPage( Title $title, $expected ) {
754  $actual = $title->canHaveTalkPage();
755  $this->assertSame( $expected, $actual, $title->getPrefixedDBkey() );
756  }
757 
758  public static function provideGetTalkPage_good() {
759  return [
760  [ Title::makeTitle( NS_MAIN, 'Test' ), Title::makeTitle( NS_TALK, 'Test' ) ],
761  [ Title::makeTitle( NS_TALK, 'Test' ), Title::makeTitle( NS_TALK, 'Test' ) ],
762  ];
763  }
764 
769  public function testGetTalkPage_good( Title $title, Title $expected ) {
770  $talk = $title->getTalkPage();
771  $this->assertSame(
772  $expected->getPrefixedDBKey(),
773  $talk->getPrefixedDBKey(),
774  $title->getPrefixedDBKey()
775  );
776  }
777 
783  $talk = $title->getTalkPageIfDefined();
784  $this->assertInstanceOf(
785  Title::class,
786  $talk,
787  $title->getPrefixedDBKey()
788  );
789  }
790 
791  public static function provideGetTalkPage_bad() {
792  return [
793  [ Title::makeTitle( NS_SPECIAL, 'Test' ) ],
794  [ Title::makeTitle( NS_MEDIA, 'Test' ) ],
795  ];
796  }
797 
803  $talk = $title->getTalkPageIfDefined();
804  $this->assertNull(
805  $talk,
806  $title->getPrefixedDBKey()
807  );
808  }
809 
810  public function provideCreateFragmentTitle() {
811  return [
812  [ Title::makeTitle( NS_MAIN, 'Test' ), 'foo' ],
813  [ Title::makeTitle( NS_TALK, 'Test', 'foo' ), '' ],
814  [ Title::makeTitle( NS_CATEGORY, 'Test', 'foo' ), 'bar' ],
815  [ Title::makeTitle( NS_MAIN, 'Test1', '', 'interwiki' ), 'baz' ]
816  ];
817  }
818 
823  public function testCreateFragmentTitle( Title $title, $fragment ) {
824  $this->mergeMwGlobalArrayValue( 'wgHooks', [
825  'InterwikiLoadPrefix' => [
826  function ( $prefix, &$iwdata ) {
827  if ( $prefix === 'interwiki' ) {
828  $iwdata = [
829  'iw_url' => 'http://example.com/',
830  'iw_local' => 0,
831  'iw_trans' => 0,
832  ];
833  return false;
834  }
835  },
836  ],
837  ] );
838 
839  $fragmentTitle = $title->createFragmentTarget( $fragment );
840 
841  $this->assertEquals( $title->getNamespace(), $fragmentTitle->getNamespace() );
842  $this->assertEquals( $title->getText(), $fragmentTitle->getText() );
843  $this->assertEquals( $title->getInterwiki(), $fragmentTitle->getInterwiki() );
844  $this->assertEquals( $fragment, $fragmentTitle->getFragment() );
845  }
846 
847  public function provideGetPrefixedText() {
848  return [
849  // ns = 0
850  [
851  Title::makeTitle( NS_MAIN, 'Foo bar' ),
852  'Foo bar'
853  ],
854  // ns = 2
855  [
856  Title::makeTitle( NS_USER, 'Foo bar' ),
857  'User:Foo bar'
858  ],
859  // ns = 3
860  [
861  Title::makeTitle( NS_USER_TALK, 'Foo bar' ),
862  'User talk:Foo bar'
863  ],
864  // fragment not included
865  [
866  Title::makeTitle( NS_MAIN, 'Foo bar', 'fragment' ),
867  'Foo bar'
868  ],
869  // ns = -2
870  [
871  Title::makeTitle( NS_MEDIA, 'Foo bar' ),
872  'Media:Foo bar'
873  ],
874  // non-existent namespace
875  [
876  Title::makeTitle( 100777, 'Foo bar' ),
877  'Special:Badtitle/NS100777:Foo bar'
878  ],
879  ];
880  }
881 
886  public function testGetPrefixedText( Title $title, $expected ) {
887  $this->assertEquals( $expected, $title->getPrefixedText() );
888  }
889 
890  public function provideGetPrefixedDBKey() {
891  return [
892  // ns = 0
893  [
894  Title::makeTitle( NS_MAIN, 'Foo_bar' ),
895  'Foo_bar'
896  ],
897  // ns = 2
898  [
899  Title::makeTitle( NS_USER, 'Foo_bar' ),
900  'User:Foo_bar'
901  ],
902  // ns = 3
903  [
904  Title::makeTitle( NS_USER_TALK, 'Foo_bar' ),
905  'User_talk:Foo_bar'
906  ],
907  // fragment not included
908  [
909  Title::makeTitle( NS_MAIN, 'Foo_bar', 'fragment' ),
910  'Foo_bar'
911  ],
912  // ns = -2
913  [
914  Title::makeTitle( NS_MEDIA, 'Foo_bar' ),
915  'Media:Foo_bar'
916  ],
917  // non-existent namespace
918  [
919  Title::makeTitle( 100777, 'Foo_bar' ),
920  'Special:Badtitle/NS100777:Foo_bar'
921  ],
922  ];
923  }
924 
929  public function testGetPrefixedDBKey( Title $title, $expected ) {
930  $this->assertEquals( $expected, $title->getPrefixedDBkey() );
931  }
932 
940  public function testGetFragmentForURL( $titleStr, $expected ) {
941  $this->setMwGlobals( [
942  'wgFragmentMode' => [ 'html5' ],
943  'wgExternalInterwikiFragmentMode' => 'legacy',
944  ] );
945  $dbw = wfGetDB( DB_MASTER );
946  $dbw->insert( 'interwiki',
947  [
948  [
949  'iw_prefix' => 'de',
950  'iw_url' => 'http://de.wikipedia.org/wiki/',
951  'iw_api' => 'http://de.wikipedia.org/w/api.php',
952  'iw_wikiid' => 'dewiki',
953  'iw_local' => 1,
954  'iw_trans' => 0,
955  ],
956  [
957  'iw_prefix' => 'zz',
958  'iw_url' => 'http://zzwiki.org/wiki/',
959  'iw_api' => 'http://zzwiki.org/w/api.php',
960  'iw_wikiid' => 'zzwiki',
961  'iw_local' => 0,
962  'iw_trans' => 0,
963  ],
964  ],
965  __METHOD__,
966  [ 'IGNORE' ]
967  );
968 
969  $title = Title::newFromText( $titleStr );
970  self::assertEquals( $expected, $title->getFragmentForURL() );
971 
972  $dbw->delete( 'interwiki', '*', __METHOD__ );
973  }
974 
975  public function provideGetFragmentForURL() {
976  return [
977  [ 'Foo', '' ],
978  [ 'Foo#ümlåût', '#ümlåût' ],
979  [ 'de:Foo#Bå®', '#Bå®' ],
980  [ 'zz:Foo#тест', '#.D1.82.D0.B5.D1.81.D1.82' ],
981  ];
982  }
983 
988  public function testIsRawHtmlMessage( $textForm, $expected ) {
989  $this->setMwGlobals( 'wgRawHtmlMessages', [
990  'foobar',
991  'foo_bar',
992  'foo-bar',
993  ] );
994 
995  $title = Title::newFromText( $textForm );
996  $this->assertSame( $expected, $title->isRawHtmlMessage() );
997  }
998 
999  public function provideIsRawHtmlMessage() {
1000  return [
1001  [ 'MediaWiki:Foobar', true ],
1002  [ 'MediaWiki:Foo bar', true ],
1003  [ 'MediaWiki:Foo-bar', true ],
1004  [ 'MediaWiki:foo bar', true ],
1005  [ 'MediaWiki:foo-bar', true ],
1006  [ 'MediaWiki:foobar', true ],
1007  [ 'MediaWiki:some-other-message', false ],
1008  [ 'Main Page', false ],
1009  ];
1010  }
1011 
1012  public function provideEquals() {
1013  yield [
1014  Title::newFromText( 'Main Page' ),
1015  Title::newFromText( 'Main Page' ),
1016  true
1017  ];
1018  yield [
1019  Title::newFromText( 'Main Page' ),
1020  Title::newFromText( 'Not The Main Page' ),
1021  false
1022  ];
1023  yield [
1024  Title::newFromText( 'Main Page' ),
1025  Title::newFromText( 'Project:Main Page' ),
1026  false
1027  ];
1028  yield [
1029  Title::newFromText( 'File:Example.png' ),
1030  Title::newFromText( 'Image:Example.png' ),
1031  true
1032  ];
1033  yield [
1034  Title::newFromText( 'Special:Version' ),
1035  Title::newFromText( 'Special:Version' ),
1036  true
1037  ];
1038  yield [
1039  Title::newFromText( 'Special:Version' ),
1040  Title::newFromText( 'Special:Recentchanges' ),
1041  false
1042  ];
1043  yield [
1044  Title::newFromText( 'Special:Version' ),
1045  Title::newFromText( 'Main Page' ),
1046  false
1047  ];
1048  yield [
1049  Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
1050  Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
1051  true
1052  ];
1053  yield [
1054  Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
1055  Title::makeTitle( NS_MAIN, 'Bar', '', '' ),
1056  false
1057  ];
1058  yield [
1059  Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
1060  Title::makeTitle( NS_TALK, 'Foo', '', '' ),
1061  false
1062  ];
1063  yield [
1064  Title::makeTitle( NS_MAIN, 'Foo', 'Bar', '' ),
1065  Title::makeTitle( NS_MAIN, 'Foo', 'Bar', '' ),
1066  true
1067  ];
1068  yield [
1069  Title::makeTitle( NS_MAIN, 'Foo', 'Bar', '' ),
1070  Title::makeTitle( NS_MAIN, 'Foo', 'Baz', '' ),
1071  true
1072  ];
1073  yield [
1074  Title::makeTitle( NS_MAIN, 'Foo', 'Bar', '' ),
1075  Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
1076  true
1077  ];
1078  yield [
1079  Title::makeTitle( NS_MAIN, 'Foo', '', 'baz' ),
1080  Title::makeTitle( NS_MAIN, 'Foo', '', 'baz' ),
1081  true
1082  ];
1083  yield [
1084  Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
1085  Title::makeTitle( NS_MAIN, 'Foo', '', 'baz' ),
1086  false
1087  ];
1088  }
1089 
1094  public function testEquals( Title $firstValue, /* LinkTarget */ $secondValue, $expectedSame ) {
1095  $this->assertSame(
1096  $expectedSame,
1097  $firstValue->equals( $secondValue )
1098  );
1099  }
1100 }
TitleTest\provideGetPrefixedText
provideGetPrefixedText()
Definition: TitleTest.php:847
$user
return true to allow those checks to and false if checking is done & $user
Definition: hooks.txt:1476
$article
return true to allow those checks to and false if checking is done remove or add to the links of a group of changes in EnhancedChangesList Hook subscribers can return false to omit this line from recentchanges use this to change the tables headers change it to an object instance and return false override the list derivative used the name of the old file & $article
Definition: hooks.txt:1476
TitleTest\provideSpecialNamesWithAndWithoutParameter
static provideSpecialNamesWithAndWithoutParameter()
Definition: TitleTest.php:277
Title\newFromText
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition: Title.php:306
MediaWikiTitleCodec
A codec for MediaWiki page titles.
Definition: MediaWikiTitleCodec.php:38
TitleTest\testGetFragmentForURL
testGetFragmentForURL( $titleStr, $expected)
Title::getFragmentForURL provideGetFragmentForURL.
Definition: TitleTest.php:940
false
processing should stop and the error should be shown to the user * false
Definition: hooks.txt:187
TitleTest\testLegalChars
testLegalChars()
Title::legalChars.
Definition: TitleTest.php:26
MediaWikiTestCase\mergeMwGlobalArrayValue
mergeMwGlobalArrayValue( $name, $values)
Merges the given values into a MW global array variable.
Definition: MediaWikiTestCase.php:904
TitleTest\provideCanHaveTalkPage
provideCanHaveTalkPage()
Definition: TitleTest.php:729
TitleTest\provideConvertByteClassToUnicodeClass
static provideConvertByteClassToUnicodeClass()
Definition: TitleTest.php:188
$lang
if(!isset( $args[0])) $lang
Definition: testCompression.php:33
TitleTest\provideIsRawHtmlMessage
provideIsRawHtmlMessage()
Definition: TitleTest.php:999
MalformedTitleException\getErrorMessage
getErrorMessage()
Definition: MalformedTitleException.php:64
captcha-old.count
count
Definition: captcha-old.py:249
TitleTest\provideIsAlwaysKnown
static provideIsAlwaysKnown()
Definition: TitleTest.php:657
TitleTest\testCreateFragmentTitle
testCreateFragmentTitle(Title $title, $fragment)
Title::createFragmentTarget provideCreateFragmentTitle.
Definition: TitleTest.php:823
Title\NEW_CLONE
const NEW_CLONE
Flag for use with factory methods like newFromLinkTarget() that have a $forceClone parameter.
Definition: Title.php:64
TitleTest\testConvertByteClassToUnicodeClass
testConvertByteClassToUnicodeClass( $byteClass, $unicodeClass)
provideConvertByteClassToUnicodeClass Title::convertByteClassToUnicodeClass
Definition: TitleTest.php:253
TitleTest\testGetPageViewLanguage
testGetPageViewLanguage( $expected, $titleText, $contLang, $lang, $variant, $msg='')
provideGetPageViewLanguage Title::getPageViewLanguage
Definition: TitleTest.php:426
$result
The index of the header message $result[1]=The index of the body text message $result[2 through n]=Parameters passed to body text message. Please note the header message cannot receive/use parameters. 'ImportHandleLogItemXMLTag':When parsing a XML tag in a log item. Return false to stop further processing of the tag $reader:XMLReader object $logInfo:Array of information 'ImportHandlePageXMLTag':When parsing a XML tag in a page. Return false to stop further processing of the tag $reader:XMLReader object & $pageInfo:Array of information 'ImportHandleRevisionXMLTag':When parsing a XML tag in a page revision. Return false to stop further processing of the tag $reader:XMLReader object $pageInfo:Array of page information $revisionInfo:Array of revision information 'ImportHandleToplevelXMLTag':When parsing a top level XML tag. Return false to stop further processing of the tag $reader:XMLReader object 'ImportHandleUnknownUser':When a user doesn 't exist locally, this hook is called to give extensions an opportunity to auto-create it. If the auto-creation is successful, return false. $name:User name 'ImportHandleUploadXMLTag':When parsing a XML tag in a file upload. Return false to stop further processing of the tag $reader:XMLReader object $revisionInfo:Array of information 'ImportLogInterwikiLink':Hook to change the interwiki link used in log entries and edit summaries for transwiki imports. & $fullInterwikiPrefix:Interwiki prefix, may contain colons. & $pageTitle:String that contains page title. 'ImportSources':Called when reading from the $wgImportSources configuration variable. Can be used to lazy-load the import sources list. & $importSources:The value of $wgImportSources. Modify as necessary. See the comment in DefaultSettings.php for the detail of how to structure this array. 'InfoAction':When building information to display on the action=info page. $context:IContextSource object & $pageInfo:Array of information 'InitializeArticleMaybeRedirect':MediaWiki check to see if title is a redirect. & $title:Title object for the current page & $request:WebRequest & $ignoreRedirect:boolean to skip redirect check & $target:Title/string of redirect target & $article:Article object 'InternalParseBeforeLinks':during Parser 's internalParse method before links but after nowiki/noinclude/includeonly/onlyinclude and other processings. & $parser:Parser object & $text:string containing partially parsed text & $stripState:Parser 's internal StripState object 'InternalParseBeforeSanitize':during Parser 's internalParse method just before the parser removes unwanted/dangerous HTML tags and after nowiki/noinclude/includeonly/onlyinclude and other processings. Ideal for syntax-extensions after template/parser function execution which respect nowiki and HTML-comments. & $parser:Parser object & $text:string containing partially parsed text & $stripState:Parser 's internal StripState object 'InterwikiLoadPrefix':When resolving if a given prefix is an interwiki or not. Return true without providing an interwiki to continue interwiki search. $prefix:interwiki prefix we are looking for. & $iwData:output array describing the interwiki with keys iw_url, iw_local, iw_trans and optionally iw_api and iw_wikiid. 'InvalidateEmailComplete':Called after a user 's email has been invalidated successfully. $user:user(object) whose email is being invalidated 'IRCLineURL':When constructing the URL to use in an IRC notification. Callee may modify $url and $query, URL will be constructed as $url . $query & $url:URL to index.php & $query:Query string $rc:RecentChange object that triggered url generation 'IsFileCacheable':Override the result of Article::isFileCacheable()(if true) & $article:article(object) being checked 'IsTrustedProxy':Override the result of IP::isTrustedProxy() & $ip:IP being check & $result:Change this value to override the result of IP::isTrustedProxy() 'IsUploadAllowedFromUrl':Override the result of UploadFromUrl::isAllowedUrl() $url:URL used to upload from & $allowed:Boolean indicating if uploading is allowed for given URL 'isValidEmailAddr':Override the result of Sanitizer::validateEmail(), for instance to return false if the domain name doesn 't match your organization. $addr:The e-mail address entered by the user & $result:Set this and return false to override the internal checks 'isValidPassword':Override the result of User::isValidPassword() $password:The password entered by the user & $result:Set this and return false to override the internal checks $user:User the password is being validated for 'Language::getMessagesFileName':$code:The language code or the language we 're looking for a messages file for & $file:The messages file path, you can override this to change the location. 'LanguageGetNamespaces':Provide custom ordering for namespaces or remove namespaces. Do not use this hook to add namespaces. Use CanonicalNamespaces for that. & $namespaces:Array of namespaces indexed by their numbers 'LanguageGetTranslatedLanguageNames':Provide translated language names. & $names:array of language code=> language name $code:language of the preferred translations 'LanguageLinks':Manipulate a page 's language links. This is called in various places to allow extensions to define the effective language links for a page. $title:The page 's Title. & $links:Array with elements of the form "language:title" in the order that they will be output. & $linkFlags:Associative array mapping prefixed links to arrays of flags. Currently unused, but planned to provide support for marking individual language links in the UI, e.g. for featured articles. 'LanguageSelector':Hook to change the language selector available on a page. $out:The output page. $cssClassName:CSS class name of the language selector. 'LinkBegin':DEPRECATED since 1.28! Use HtmlPageLinkRendererBegin instead. Used when generating internal and interwiki links in Linker::link(), before processing starts. Return false to skip default processing and return $ret. See documentation for Linker::link() for details on the expected meanings of parameters. $skin:the Skin object $target:the Title that the link is pointing to & $html:the contents that the< a > tag should have(raw HTML) $result
Definition: hooks.txt:1983
TitleTest\testGetTalkPage_good
testGetTalkPage_good(Title $title, Title $expected)
provideGetTalkPage_good Title::getTalkPage
Definition: TitleTest.php:769
TitleTest\provideGetFragmentForURL
provideGetFragmentForURL()
Definition: TitleTest.php:975
TitleTest\provideBaseTitleCases
static provideBaseTitleCases()
Definition: TitleTest.php:498
GenderCache
Caches user genders when needed to use correct namespace aliases.
Definition: GenderCache.php:31
TitleTest\provideSubpageTitleCases
static provideSubpageTitleCases()
Definition: TitleTest.php:539
TitleTest\provideEquals
provideEquals()
Definition: TitleTest.php:1012
TitleTest\provideTestIsValidMoveOperation
static provideTestIsValidMoveOperation()
Definition: TitleTest.php:309
User
User
Definition: All_system_messages.txt:425
Title\convertByteClassToUnicodeClass
static convertByteClassToUnicodeClass( $byteClass)
Utility method for converting a character sequence from bytes to Unicode.
Definition: Title.php:683
TitleTest\testGetSubpageText
testGetSubpageText( $title, $expected, $msg='')
Definition: TitleTest.php:531
TitleTest\testSecureAndSplitInvalid
testSecureAndSplitInvalid( $text, $expectedErrorMessage)
See also mediawiki.Title.test.js Title::secureAndSplit provideInvalidSecureAndSplit.
Definition: TitleTest.php:178
php
injection txt This is an overview of how MediaWiki makes use of dependency injection The design described here grew from the discussion of RFC T384 The term dependency this means that anything an object needs to operate should be injected from the the object itself should only know narrow no concrete implementation of the logic it relies on The requirement to inject everything typically results in an architecture that based on two main types of and essentially stateless service objects that use other service objects to operate on the value objects As of the beginning MediaWiki is only starting to use the DI approach Much of the code still relies on global state or direct resulting in a highly cyclical dependency which acts as the top level factory for services in MediaWiki which can be used to gain access to default instances of various services MediaWikiServices however also allows new services to be defined and default services to be redefined Services are defined or redefined by providing a callback the instantiator that will return a new instance of the service When it will create an instance of MediaWikiServices and populate it with the services defined in the files listed by thereby bootstrapping the DI framework Per $wgServiceWiringFiles lists includes ServiceWiring php
Definition: injection.txt:35
TitleTest\testGetFragment
testGetFragment( $full, $fragment)
Title::getFragment provideGetFragment.
Definition: TitleTest.php:641
NS_MAIN
const NS_MAIN
Definition: Defines.php:64
NS_SPECIAL
const NS_SPECIAL
Definition: Defines.php:53
TitleTest\testIsAlwaysKnownOnInterwiki
testIsAlwaysKnownOnInterwiki()
Title::isAlwaysKnown.
Definition: TitleTest.php:694
$data
$data
Utility to generate mapping file used in mw.Title (phpCharToUpper.json)
Definition: generatePhpCharToUpperMappings.php:13
TitleTest\provideGetTalkPage_bad
static provideGetTalkPage_bad()
Definition: TitleTest.php:791
$title
namespace and then decline to actually register it file or subcat img or subcat $title
Definition: hooks.txt:925
NS_PROJECT
const NS_PROJECT
Definition: Defines.php:68
wfGetDB
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
Definition: GlobalFunctions.php:2636
MediaWikiTestCase\setMwGlobals
setMwGlobals( $pairs, $value=null)
Sets a global, maintaining a stashed version of the previous global to be restored in tearDown.
Definition: MediaWikiTestCase.php:709
MediaWikiTestCase
Definition: MediaWikiTestCase.php:17
TitleTest\testIsRawHtmlMessage
testIsRawHtmlMessage( $textForm, $expected)
Title::isRawHtmlMessage provideIsRawHtmlMessage.
Definition: TitleTest.php:988
TitleTest\dataWgWhitelistReadRegexp
dataWgWhitelistReadRegexp()
Provides test parameter values for testWgWhitelistReadRegexp()
Definition: TitleTest.php:377
use
as see the revision history and available at free of to any person obtaining a copy of this software and associated documentation to deal in the Software without including without limitation the rights to use
Definition: MIT-LICENSE.txt:10
TitleTest\testIsValidMoveOperation
testIsValidMoveOperation( $source, $target, $expected)
Auth-less test of Title::isValidMoveOperation.
Definition: TitleTest.php:294
Title\makeTitle
static makeTitle( $ns, $title, $fragment='', $interwiki='')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:576
Title\equals
equals(Title $title)
Compare with another title.
Definition: Title.php:4006
NS_CATEGORY
const NS_CATEGORY
Definition: Defines.php:78
MediaWikiTestCase\setUserLang
setUserLang( $lang)
Definition: MediaWikiTestCase.php:1057
DB_MASTER
const DB_MASTER
Definition: defines.php:26
WikitextContent
Content object for wiki text pages.
Definition: WikitextContent.php:36
array
The wiki should then use memcached to cache various data To use multiple just add more items to the array To increase the weight of a make its entry a array("192.168.0.1:11211", 2))
TitleTest\testSecureAndSplitValid
testSecureAndSplitValid( $text)
See also mediawiki.Title.test.js Title::secureAndSplit provideValidSecureAndSplit.
Definition: TitleTest.php:167
TitleTest
Database Title.
Definition: TitleTest.php:10
TitleTest\testFixSpecialNameRetainsParameter
testFixSpecialNameRetainsParameter( $text, $expectedParam)
provideSpecialNamesWithAndWithoutParameter Title::fixSpecialName
Definition: TitleTest.php:261
TitleTest\provideGetPageViewLanguage
static provideGetPageViewLanguage()
Definition: TitleTest.php:447
null
this hook is for auditing only or null if authentication failed before getting that far or null if we can t even determine that When $user is not null
Definition: hooks.txt:780
Title\newFromTextThrow
static newFromTextThrow( $text, $defaultNamespace=NS_MAIN)
Like Title::newFromText(), but throws MalformedTitleException when the title is invalid,...
Definition: Title.php:343
MediaWikiTestCase\setContentLang
setContentLang( $lang)
Definition: MediaWikiTestCase.php:1066
TitleTest\testEquals
testEquals(Title $firstValue, $secondValue, $expectedSame)
Title::equals provideEquals.
Definition: TitleTest.php:1094
NS_USER_TALK
const NS_USER_TALK
Definition: Defines.php:67
TitleTest\provideGetPrefixedDBKey
provideGetPrefixedDBKey()
Definition: TitleTest.php:890
TitleTest\provideNewFromTitleValue
static provideNewFromTitleValue()
Definition: TitleTest.php:547
$value
$value
Definition: styleTest.css.php:49
TitleTest\testIsAlwaysKnown
testIsAlwaysKnown( $page, $isKnown)
Title::isAlwaysKnown provideIsAlwaysKnown.
Definition: TitleTest.php:652
NS_MEDIA
const NS_MEDIA
Definition: Defines.php:52
TitleTest\provideGetFragment
static provideGetFragment()
Definition: TitleTest.php:616
TitleTest\flattenErrorsArray
flattenErrorsArray( $errors)
Definition: TitleTest.php:413
TitleTest\testNewFromLinkTarget
testNewFromLinkTarget(LinkTarget $value)
Title::newFromLinkTarget provideNewFromTitleValue.
Definition: TitleTest.php:572
Title\GAID_FOR_UPDATE
const GAID_FOR_UPDATE
Used to be GAID_FOR_UPDATE define.
Definition: Title.php:55
Title\newFromDBkey
static newFromDBkey( $key)
Create a new Title from a prefixed DB key.
Definition: Title.php:231
TitleTest\testGetBaseText
testGetBaseText( $title, $expected, $msg='')
provideBaseTitleCases Title::getBaseText
Definition: TitleTest.php:490
TitleTest\testNewFromTitleValue
testNewFromTitleValue(TitleValue $value)
Title::newFromTitleValue provideNewFromTitleValue.
Definition: TitleTest.php:559
TitleTest\testGetTitleValue
testGetTitleValue( $text)
Title::getTitleValue provideGetTitleValue.
Definition: TitleTest.php:606
TitleTest\provideCreateFragmentTitle
provideCreateFragmentTitle()
Definition: TitleTest.php:810
TitleTest\provideIsValid
static provideIsValid()
Definition: TitleTest.php:679
Title\newFromLinkTarget
static newFromLinkTarget(LinkTarget $linkTarget, $forceClone='')
Returns a Title given a LinkTarget.
Definition: Title.php:269
TitleTest\provideInvalidSecureAndSplit
static provideInvalidSecureAndSplit()
Definition: TitleTest.php:82
Title
Represents a title within MediaWiki.
Definition: Title.php:40
TitleTest\provideValidSecureAndSplit
static provideValidSecureAndSplit()
Definition: TitleTest.php:45
TitleTest\testGetPrefixedText
testGetPrefixedText(Title $title, $expected)
Title::getPrefixedText provideGetPrefixedText.
Definition: TitleTest.php:886
TitleTest\secureAndSplitGlobals
secureAndSplitGlobals()
Definition: TitleTest.php:136
TitleTest\testGetTalkPageIfDefined_bad
testGetTalkPageIfDefined_bad(Title $title)
provideGetTalkPage_bad Title::getTalkPageIfDefined
Definition: TitleTest.php:802
MalformedTitleException
MalformedTitleException is thrown when a TitleParser is unable to parse a title string.
Definition: MalformedTitleException.php:25
TitleTest\testNewFromLinkTarget_clone
testNewFromLinkTarget_clone()
Title::newFromLinkTarget.
Definition: TitleTest.php:584
TitleTest\provideRootTitleCases
static provideRootTitleCases()
Definition: TitleTest.php:518
TitleTest\testIsValid
testIsValid(Title $title, $isValid)
Title::isValid provideIsValid.
Definition: TitleTest.php:675
TitleTest\testCanHaveTalkPage
testCanHaveTalkPage(Title $title, $expected)
provideCanHaveTalkPage Title::canHaveTalkPage
Definition: TitleTest.php:753
TitleTest\testGetRootText
testGetRootText( $title, $expected, $msg='')
provideRootTitleCases Title::getRootText
Definition: TitleTest.php:510
as
This document is intended to provide useful advice for parties seeking to redistribute MediaWiki to end users It s targeted particularly at maintainers for Linux since it s been observed that distribution packages of MediaWiki often break We ve consistently had to recommend that users seeking support use official tarballs instead of their distribution s and this often solves whatever problem the user is having It would be nice if this could such as
Definition: distributors.txt:9
TitleTest\testGetTalkPageIfDefined_good
testGetTalkPageIfDefined_good(Title $title)
provideGetTalkPage_good Title::getTalkPageIfDefined
Definition: TitleTest.php:782
TitleTest\testGetPrefixedDBKey
testGetPrefixedDBKey(Title $title, $expected)
Title::getPrefixedDBKey provideGetPrefixedDBKey.
Definition: TitleTest.php:929
NS_USER
const NS_USER
Definition: Defines.php:66
$source
$source
Definition: mwdoc-filter.php:46
true
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses just before the function returns a value If you return true
Definition: hooks.txt:1985
NS_TALK
const NS_TALK
Definition: Defines.php:65
TitleTest\testExists
testExists()
Title::exists.
Definition: TitleTest.php:702
Language\factory
static factory( $code)
Get a cached or new language object for a given language code.
Definition: Language.php:215
TitleTest\provideGetTitleValue
static provideGetTitleValue()
Definition: TitleTest.php:594
TitleTest\testWgWhitelistReadRegexp
testWgWhitelistReadRegexp( $whitelistRegexp, $source, $action, $expected)
Auth-less test of Title::userCan.
Definition: TitleTest.php:333
class
you have access to all of the normal MediaWiki so you can get a DB use the etc For full docs on the Maintenance class
Definition: maintenance.txt:52
Title\legalChars
static legalChars()
Get a regex character class describing the legal characters in a link.
Definition: Title.php:669
Article
Class for viewing MediaWiki article and history.
Definition: Article.php:37
TitleTest\provideGetTalkPage_good
static provideGetTalkPage_good()
Definition: TitleTest.php:758
MediaWikiServices
injection txt This is an overview of how MediaWiki makes use of dependency injection The design described here grew from the discussion of RFC T384 The term dependency this means that anything an object needs to operate should be injected from the the object itself should only know narrow no concrete implementation of the logic it relies on The requirement to inject everything typically results in an architecture that based on two main types of and essentially stateless service objects that use other service objects to operate on the value objects As of the beginning MediaWiki is only starting to use the DI approach Much of the code still relies on global state or direct resulting in a highly cyclical dependency MediaWikiServices
Definition: injection.txt:23
MediaWiki\Linker\LinkTarget
Definition: LinkTarget.php:26
MediaWikiTestCase\setService
setService( $name, $object)
Sets a service, maintaining a stashed version of the previous service to be restored in tearDown.
Definition: MediaWikiTestCase.php:649
TitleTest\setUp
setUp()
Definition: TitleTest.php:11
TitleValue
Represents a page (or page fragment) title within MediaWiki.
Definition: TitleValue.php:36
Title\newFromTitleValue
static newFromTitleValue(TitleValue $titleValue, $forceClone='')
Returns a Title given a TitleValue.
Definition: Title.php:254