Title: Use a more proper way of detecting whether interwikis are local
authorMax Semenik <maxsem.wiki@gmail.com>
Tue, 28 Nov 2017 23:17:46 +0000 (15:17 -0800)
committerLegoktm <legoktm@member.fsf.org>
Thu, 30 Nov 2017 23:32:50 +0000 (23:32 +0000)
Bug: T181575
Change-Id: Ifcfe609ce01b174120b81b8c0bf82c4ed6077641

includes/Title.php
tests/phpunit/includes/TitleTest.php

index 829be44..d0d77e3 100644 (file)
@@ -1464,7 +1464,9 @@ class Title implements LinkTarget {
        public function getFragmentForURL() {
                if ( !$this->hasFragment() ) {
                        return '';
-               } elseif ( $this->isExternal() && !$this->getTransWikiID() ) {
+               } elseif ( $this->isExternal()
+                       && !self::getInterwikiLookup()->fetch( $this->mInterwiki )->isLocal()
+               ) {
                        return '#' . Sanitizer::escapeIdForExternalInterwiki( $this->getFragment() );
                }
                return '#' . Sanitizer::escapeIdForLink( $this->getFragment() );
index 5a92b99..75e0c3e 100644 (file)
@@ -911,4 +911,54 @@ class TitleTest extends MediaWikiTestCase {
        public function testGetPrefixedDBKey( Title $title, $expected ) {
                $this->assertEquals( $expected, $title->getPrefixedDBkey() );
        }
+
+       /**
+        * @dataProvider provideGetFragmentForURL
+        *
+        * @param string $titleStr
+        * @param string $expected
+        */
+       public function testGetFragmentForURL( $titleStr, $expected ) {
+               $this->setMwGlobals( [
+                       'wgFragmentMode' => [ 'html5' ],
+                       'wgExternalInterwikiFragmentMode' => 'legacy',
+               ] );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->insert( 'interwiki',
+                       [
+                               [
+                                       'iw_prefix' => 'de',
+                                       'iw_url' => 'http://de.wikipedia.org/wiki/',
+                                       'iw_api' => 'http://de.wikipedia.org/w/api.php',
+                                       'iw_wikiid' => 'dewiki',
+                                       'iw_local' => 1,
+                                       'iw_trans' => 0,
+                               ],
+                               [
+                                       'iw_prefix' => 'zz',
+                                       'iw_url' => 'http://zzwiki.org/wiki/',
+                                       'iw_api' => 'http://zzwiki.org/w/api.php',
+                                       'iw_wikiid' => 'zzwiki',
+                                       'iw_local' => 0,
+                                       'iw_trans' => 0,
+                               ],
+                       ],
+                       __METHOD__,
+                       [ 'IGNORE' ]
+               );
+
+               $title = Title::newFromText( $titleStr );
+               self::assertEquals( $expected, $title->getFragmentForURL() );
+
+               $dbw->delete( 'interwiki', '*', __METHOD__ );
+       }
+
+       public function provideGetFragmentForURL() {
+               return [
+                       [ 'Foo', '' ],
+                       [ 'Foo#ümlåût', '#ümlåût' ],
+                       [ 'de:Foo#Bå®', '#Bå®' ],
+                       [ 'zz:Foo#тест', '#.D1.82.D0.B5.D1.81.D1.82' ],
+               ];
+       }
 }