description: mw.msg( 'rcfilters-filter-registered-description' )
},
{
- name: 'hideanon',
+ name: 'hideanons',
label: mw.msg( 'rcfilters-filter-unregistered-label' ),
description: mw.msg( 'rcfilters-filter-unregistered-description' )
}
// Initialize values
controller.initialize();
+ // HACK: Remove old-style filter links for filters handled by the widget
+ // Ideally the widget would handle all filters and we'd just remove .rcshowhide entirely
+ $( '.rcshowhide' ).children().each( function () {
+ // HACK: Interpret the class name to get the filter name
+ // This should really be set as a data attribute
+ var i,
+ name = null,
+ // Some of the older browsers we support don't have .classList,
+ // so we have to interpret the class attribute manually.
+ classes = this.getAttribute( 'class' ).split( ' ' );
+ for ( i = 0; i < classes.length; i++ ) {
+ if ( classes[ i ].substr( 0, 'rcshow'.length ) === 'rcshow' ) {
+ name = classes[ i ].substr( 'rcshow'.length );
+ break;
+ }
+ }
+ if ( name === null ) {
+ return;
+ }
+ if ( name === 'hidemine' ) {
+ // HACK: the span for hidemyself is called hidemine
+ name = 'hidemyself';
+ }
+ // This span corresponds to a filter that's in our model, so remove it
+ if ( model.getItemByName( name ) ) {
+ // HACK: Remove the text node after the span.
+ // If there isn't one, we're at the end, so remove the text node before the span.
+ // This would be unnecessary if we added separators with CSS.
+ if ( this.nextSibling && this.nextSibling.nodeType === Node.TEXT_NODE ) {
+ this.parentNode.removeChild( this.nextSibling );
+ } else if ( this.previousSibling && this.previousSibling.nodeType === Node.TEXT_NODE ) {
+ this.parentNode.removeChild( this.previousSibling );
+ }
+ // Remove the span itself
+ this.parentNode.removeChild( this );
+ }
+ } );
+
$( '.rcoptions form' ).submit( function () {
var $form = $( this );
const SCREEN_MEDIA_QUERY = 'screen and (min-width: 982px)';
const SCREEN_ONLY_MEDIA_QUERY = 'only screen and (min-width: 982px)';
+ /**
+ * @covers OutputPage::addMeta
+ * @covers OutputPage::getMetaTags
+ * @covers OutputPage::getHeadLinksArray
+ */
+ public function testMetaTags() {
+ $outputPage = $this->newInstance();
+ $outputPage->addMeta( 'http:expires', '0' );
+ $outputPage->addMeta( 'keywords', 'first' );
+ $outputPage->addMeta( 'keywords', 'second' );
+
+ $expected = [
+ [ 'http:expires', '0' ],
+ [ 'keywords', 'first' ],
+ [ 'keywords', 'second' ],
+ ];
+ $this->assertSame( $expected, $outputPage->getMetaTags() );
+
+ $links = $outputPage->getHeadLinksArray();
+ $this->assertContains( '<meta http-equiv="expires" content="0"/>', $links );
+ $this->assertContains( '<meta name="keywords" content="first"/>', $links );
+ $this->assertContains( '<meta name="keywords" content="second"/>', $links );
+ $this->assertArrayNotHasKey( 'meta-robots', $links );
+ }
+
+ /**
+ * @covers OutputPage::setIndexPolicy
+ * @covers OutputPage::setFollowPolicy
+ * @covers OutputPage::getHeadLinksArray
+ */
+ public function testRobotsPolicies() {
+ $outputPage = $this->newInstance();
+ $outputPage->setIndexPolicy( 'noindex' );
+ $outputPage->setFollowPolicy( 'nofollow' );
+
+ $links = $outputPage->getHeadLinksArray();
+ $this->assertContains( '<meta name="robots" content="noindex,nofollow"/>', $links );
+ }
+
/**
* Tests a particular case of transformCssMedia, using the given input, globals,
* expected return, and message
$this->assertEquals( [ 0 => 'Test2' ], $outputPage->getCategories( 'normal' ) );
$this->assertEquals( [ 0 => 'Test' ], $outputPage->getCategories( 'hidden' ) );
}
+
+ /**
+ * @return OutputPage
+ */
+ private function newInstance() {
+ $context = new RequestContext();
+
+ $context->setConfig( new HashConfig( [
+ 'AppleTouchIcon' => false,
+ 'DisableLangConversion' => true,
+ 'EnableAPI' => false,
+ 'EnableCanonicalServerLink' => false,
+ 'Favicon' => false,
+ 'Feed' => false,
+ 'LanguageCode' => false,
+ 'ReferrerPolicy' => false,
+ 'RightsPage' => false,
+ 'RightsUrl' => false,
+ 'UniversalEditButton' => false,
+ ] ) );
+
+ return new OutputPage( $context );
+ }
}
/**