From 4d8b064fae1be1fb2c2865ff7d4bfb4f325e1f3a Mon Sep 17 00:00:00 2001 From: Max Semenik Date: Tue, 28 Nov 2017 15:17:46 -0800 Subject: [PATCH] Title: Use a more proper way of detecting whether interwikis are local Bug: T181575 Change-Id: Ifcfe609ce01b174120b81b8c0bf82c4ed6077641 --- includes/Title.php | 4 ++- tests/phpunit/includes/TitleTest.php | 50 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/includes/Title.php b/includes/Title.php index 829be448b2..d0d77e371e 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -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() ); diff --git a/tests/phpunit/includes/TitleTest.php b/tests/phpunit/includes/TitleTest.php index 5a92b99b41..75e0c3ef01 100644 --- a/tests/phpunit/includes/TitleTest.php +++ b/tests/phpunit/includes/TitleTest.php @@ -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' ], + ]; + } } -- 2.20.1