Merge "Revert "Toolbar: Only show on WikiText pages""
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 1 Sep 2014 14:07:01 +0000 (14:07 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 1 Sep 2014 14:07:01 +0000 (14:07 +0000)
1  2 
includes/EditPage.php

diff --combined includes/EditPage.php
@@@ -66,6 -66,11 +66,6 @@@ class EditPage 
         */
        const AS_CONTENT_TOO_BIG = 216;
  
 -      /**
 -       * Status: User cannot edit? (not used)
 -       */
 -      const AS_USER_CANNOT_EDIT = 217;
 -
        /**
         * Status: this anonymous user is not allowed to edit this page
         */
        const AS_NO_CREATE_PERMISSION = 223;
  
        /**
 -       * Status: user tried to create a blank page
 +       * Status: user tried to create a blank page and wpIgnoreBlankArticle == false
         */
        const AS_BLANK_ARTICLE = 224;
  
         */
        const AS_MAX_ARTICLE_SIZE_EXCEEDED = 229;
  
 -      /**
 -       * not used
 -       */
 -      const AS_OK = 230;
 -
        /**
         * Status: WikiPage::doEdit() was unsuccessful
         */
        /** @var bool|stdClass */
        protected $lastDelete;
  
 -      /** @var bool */
 -      protected $mTokenOk = false;
 +      /** @var bool
 +       * This is public because SemanticForms uses it (bug 67522).
 +       * However, please consider using this property publicly
 +       * to be deprecated.
 +       * @protected
 +       */
 +      public $mTokenOk = false;
  
        /** @var bool */
        protected $mTokenOkExceptSuffix = false;
        /** @var bool */
        protected $allowBlankSummary = false;
  
 +      /** @var bool */
 +      protected $blankArticle = false;
 +
 +      /** @var bool */
 +      protected $allowBlankArticle = false;
 +
        /** @var string */
        protected $autoSumm = '';
  
         *
         * @param string $modelId The ID of the content model to test. Use CONTENT_MODEL_XXX constants.
         * @return bool
 -       * @throws MWException if $modelId has no known handler
 +       * @throws MWException If $modelId has no known handler
         */
        public function isSupportedContentModel( $modelId ) {
                return $this->allowNonTextContent ||
                }
        }
  
 -      /**
 -       * Show a read-only error
 -       * Parameters are the same as OutputPage:readOnlyPage()
 -       * Redirect to the article page if redlink=1
 -       * @deprecated since 1.19; use displayPermissionsError() instead
 -       */
 -      function readOnlyPage( $source = null, $protected = false, $reasons = array(), $action = null ) {
 -              wfDeprecated( __METHOD__, '1.19' );
 -
 -              global $wgRequest, $wgOut;
 -              if ( $wgRequest->getBool( 'redlink' ) ) {
 -                      // The edit page was reached via a red link.
 -                      // Redirect to the article page and let them click the edit tab if
 -                      // they really want a permission error.
 -                      $wgOut->redirect( $this->mTitle->getFullURL() );
 -              } else {
 -                      $wgOut->readOnlyPage( $source, $protected, $reasons, $action );
 -              }
 -      }
 -
        /**
         * Should we show a preview when the edit form is first shown?
         *
         * Subclasses may override this to replace the default behavior, which is
         * to check ContentHandler::supportsSections.
         *
 -       * @return bool true if this edit page supports sections, false otherwise.
 +       * @return bool True if this edit page supports sections, false otherwise.
         */
        protected function isSectionEditSupported() {
                $contentHandler = ContentHandler::getForTitle( $this->mTitle );
                        }
  
                        $this->autoSumm = $request->getText( 'wpAutoSummary' );
 +
 +                      $this->allowBlankArticle = $request->getBool( 'wpIgnoreBlankArticle' );
                } else {
                        # Not a posted form? Start with nothing.
                        wfDebug( __METHOD__ . ": Not a posted form.\n" );
                return true;
        }
  
 -      /**
 -       * Fetch initial editing page content.
 -       *
 -       * @param string|bool $def_text
 -       * @return string|bool string on success, $def_text for invalid sections
 -       * @private
 -       * @deprecated since 1.21, get WikiPage::getContent() instead.
 -       */
 -      function getContent( $def_text = false ) {
 -              ContentHandler::deprecated( __METHOD__, '1.21' );
 -
 -              if ( $def_text !== null && $def_text !== false && $def_text !== '' ) {
 -                      $def_content = $this->toEditContent( $def_text );
 -              } else {
 -                      $def_content = false;
 -              }
 -
 -              $content = $this->getContentObject( $def_content );
 -
 -              // Note: EditPage should only be used with text based content anyway.
 -              return $this->toEditText( $content );
 -      }
 -
        /**
         * @param Content|null $def_content The default value to return
         *
                }
        }
  
 -      /**
 -       * Use this method before edit() to preload some text into the edit box
 -       *
 -       * @param string $text
 -       * @deprecated since 1.21, use setPreloadedContent() instead.
 -       */
 -      public function setPreloadedText( $text ) {
 -              ContentHandler::deprecated( __METHOD__, "1.21" );
 -
 -              $content = $this->toEditContent( $text );
 -
 -              $this->setPreloadedContent( $content );
 -      }
 -
        /**
         * Use this method before edit() to preload some content into the edit box
         *
                $this->mPreloadContent = $content;
        }
  
 -      /**
 -       * Get the contents to be preloaded into the box, either set by
 -       * an earlier setPreloadText() or by loading the given page.
 -       *
 -       * @param string $preload representing the title to preload from.
 -       *
 -       * @return string
 -       *
 -       * @deprecated since 1.21, use getPreloadedContent() instead
 -       */
 -      protected function getPreloadedText( $preload ) {
 -              ContentHandler::deprecated( __METHOD__, "1.21" );
 -
 -              $content = $this->getPreloadedContent( $preload );
 -              $text = $this->toEditText( $content );
 -
 -              return $text;
 -      }
 -
        /**
         * Get the contents to be preloaded into the box, either set by
         * an earlier setPreloadText() or by loading the given page.
         * If the variable were set on the server, it would be cached, which is unwanted
         * since the post-edit state should only apply to the load right after the save.
         *
 -       * @param $statusValue int The status value (to check for new article status)
 +       * @param int $statusValue The status value (to check for new article status)
         */
        protected function setPostEditCookie( $statusValue ) {
                $revisionId = $this->mArticle->getLatest();
        /**
         * Attempt submission
         * @throws UserBlockedError|ReadOnlyError|ThrottledError|PermissionsError
 -       * @return bool false if output is done, true if the rest of the form should be displayed
 +       * @return bool False if output is done, true if the rest of the form should be displayed
         */
        public function attemptSave() {
                global $wgUser;
         * @param array|bool $resultDetails
         *
         * @throws ErrorPageError
 -       * @return bool false, if output is done, true if rest of the form should be displayed
 +       * @return bool False, if output is done, true if rest of the form should be displayed
         */
        private function handleStatus( Status $status, $resultDetails ) {
                global $wgUser, $wgOut;
                        case self::AS_TEXTBOX_EMPTY:
                        case self::AS_MAX_ARTICLE_SIZE_EXCEEDED:
                        case self::AS_END:
 +                      case self::AS_BLANK_ARTICLE:
                                return true;
  
                        case self::AS_HOOK_ERROR:
                                $wgOut->redirect( $this->mTitle->getFullURL( $extraQuery ) . $sectionanchor );
                                return false;
  
 -                      case self::AS_BLANK_ARTICLE:
 -                              $wgOut->redirect( $this->getContextTitle()->getFullURL() );
 -                              return false;
 -
                        case self::AS_SPAM_ERROR:
                                $this->spamPageWithContent( $resultDetails['spam'] );
                                return false;
                return true;
        }
  
 +      /**
 +       * Return the summary to be used for a new section.
 +       *
 +       * @param string $sectionanchor Set to the section anchor text
 +       * @return string
 +       */
 +      private function newSectionSummary( &$sectionanchor = null ) {
 +              global $wgParser;
 +
 +              if ( $this->sectiontitle !== '' ) {
 +                      $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
 +                      // If no edit summary was specified, create one automatically from the section
 +                      // title and have it link to the new section. Otherwise, respect the summary as
 +                      // passed.
 +                      if ( $this->summary === '' ) {
 +                              $cleanSectionTitle = $wgParser->stripSectionName( $this->sectiontitle );
 +                              return wfMessage( 'newsectionsummary' )
 +                                      ->rawParams( $cleanSectionTitle )->inContentLanguage()->text();
 +                      }
 +              } elseif ( $this->summary !== '' ) {
 +                      $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
 +                      # This is a new section, so create a link to the new section
 +                      # in the revision summary.
 +                      $cleanSummary = $wgParser->stripSectionName( $this->summary );
 +                      return wfMessage( 'newsectionsummary' )
 +                              ->rawParams( $cleanSummary )->inContentLanguage()->text();
 +              }
 +              return $this->summary;
 +      }
 +
        /**
         * Attempt submission (no UI)
         *
                                $defaultText = '';
                        }
  
 -                      if ( $this->textbox1 === $defaultText ) {
 +                      if ( !$this->allowBlankArticle && $this->textbox1 === $defaultText ) {
 +                              $this->blankArticle = true;
 +                              $status->fatal( 'blankarticle' );
                                $status->setResult( false, self::AS_BLANK_ARTICLE );
                                wfProfileOut( __METHOD__ );
                                return $status;
                                if ( $this->sectiontitle !== '' ) {
                                        // Insert the section title above the content.
                                        $content = $content->addSectionHeader( $this->sectiontitle );
 -
 -                                      // Jump to the new section
 -                                      $result['sectionanchor'] =
 -                                              $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
 -
 -                                      // If no edit summary was specified, create one automatically from the section
 -                                      // title and have it link to the new section. Otherwise, respect the summary as
 -                                      // passed.
 -                                      if ( $this->summary === '' ) {
 -                                              $cleanSectionTitle = $wgParser->stripSectionName( $this->sectiontitle );
 -                                              $this->summary = wfMessage( 'newsectionsummary' )
 -                                                      ->rawParams( $cleanSectionTitle )->inContentLanguage()->text();
 -                                      }
                                } elseif ( $this->summary !== '' ) {
                                        // Insert the section title above the content.
                                        $content = $content->addSectionHeader( $this->summary );
 -
 -                                      // Jump to the new section
 -                                      $result['sectionanchor'] = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
 -
 -                                      // Create a link to the new section from the edit summary.
 -                                      $cleanSummary = $wgParser->stripSectionName( $this->summary );
 -                                      $this->summary = wfMessage( 'newsectionsummary' )
 -                                              ->rawParams( $cleanSummary )->inContentLanguage()->text();
                                }
 +                              $this->summary = $this->newSectionSummary( $result['sectionanchor'] );
                        }
  
                        $status->value = self::AS_SUCCESS_NEW_ARTICLE;
                                $this->isConflict = true;
                                if ( $this->section == 'new' ) {
                                        if ( $this->mArticle->getUserText() == $wgUser->getName() &&
 -                                              $this->mArticle->getComment() == $this->summary ) {
 +                                              $this->mArticle->getComment() == $this->newSectionSummary()
 +                                      ) {
                                                // Probably a duplicate submission of a new comment.
                                                // This can happen when squid resends a request after
                                                // a timeout but the first one actually went through.
                        wfProfileIn( __METHOD__ . '-sectionanchor' );
                        $sectionanchor = '';
                        if ( $this->section == 'new' ) {
 -                              if ( $this->sectiontitle !== '' ) {
 -                                      $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
 -                                      // If no edit summary was specified, create one automatically from the section
 -                                      // title and have it link to the new section. Otherwise, respect the summary as
 -                                      // passed.
 -                                      if ( $this->summary === '' ) {
 -                                              $cleanSectionTitle = $wgParser->stripSectionName( $this->sectiontitle );
 -                                              $this->summary = wfMessage( 'newsectionsummary' )
 -                                                      ->rawParams( $cleanSectionTitle )->inContentLanguage()->text();
 -                                      }
 -                              } elseif ( $this->summary !== '' ) {
 -                                      $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
 -                                      # This is a new section, so create a link to the new section
 -                                      # in the revision summary.
 -                                      $cleanSummary = $wgParser->stripSectionName( $this->summary );
 -                                      $this->summary = wfMessage( 'newsectionsummary' )
 -                                              ->rawParams( $cleanSummary )->inContentLanguage()->text();
 -                              }
 +                              $this->summary = $this->newSectionSummary( $sectionanchor );
                        } elseif ( $this->section != '' ) {
                                # Try to get a section anchor from the section source, redirect
                                # to edited section if header found.
  
                        // Do this in its own transaction to reduce contention...
                        $dbw = wfGetDB( DB_MASTER );
 -                      $dbw->onTransactionIdle( function() use ( $dbw, $title, $watch, $wgUser, $fname ) {
 +                      $dbw->onTransactionIdle( function () use ( $dbw, $title, $watch, $wgUser, $fname ) {
                                $dbw->begin( $fname );
                                WatchAction::doWatchOrUnwatch( $watch, $title, $wgUser );
                                $dbw->commit( $fname );
                }
        }
  
 -      /**
 -       * Attempts to merge text content with base and current revisions
 -       *
 -       * @param string $editText
 -       *
 -       * @return bool
 -       * @deprecated since 1.21, use mergeChangesIntoContent() instead
 -       */
 -      function mergeChangesInto( &$editText ) {
 -              ContentHandler::deprecated( __METHOD__, "1.21" );
 -
 -              $editContent = $this->toEditContent( $editText );
 -
 -              $ok = $this->mergeChangesIntoContent( $editContent );
 -
 -              if ( $ok ) {
 -                      $editText = $this->toEditText( $editContent );
 -                      return true;
 -              }
 -              return false;
 -      }
 -
        /**
         * Attempts to do 3-way merge of edit content with a base revision
         * and current content, in case of edit conflict, in whichever way appropriate
                        $username = $parts[0];
                        $user = User::newFromName( $username, false /* allow IP users*/ );
                        $ip = User::isIP( $username );
 +                      $block = Block::newFromTarget( $user, $user );
                        if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
                                $wgOut->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n$1\n</div>",
                                        array( 'userpage-userdoesnotexist', wfEscapeWikiText( $username ) ) );
 -                      } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
 +                      } elseif ( !is_null( $block ) && $block->getType() != Block::TYPE_AUTO ) { # Show log extract if the user is currently blocked
                                LogEventsList::showLogExtract(
                                        $wgOut,
                                        'block',
 -                                      $user->getUserPage(),
 +                                      MWNamespace::getCanonicalName( NS_USER ) . ':' . $block->getTarget(),
                                        '',
                                        array(
                                                'lim' => 1,
         * @param Content|null|bool|string $content
         * @return string The editable text form of the content.
         *
 -       * @throws MWException if $content is not an instance of TextContent and
 +       * @throws MWException If $content is not an instance of TextContent and
         *   $this->allowNonTextContent is not true.
         */
        protected function toEditText( $content ) {
         * @return Content The content object created from $text. If $text was false
         *   or null, false resp. null will be  returned instead.
         *
 -       * @throws MWException if unserializing the text results in a Content
 +       * @throws MWException If unserializing the text results in a Content
         *   object that is not an instance of TextContent and
         *   $this->allowNonTextContent is not true.
         */
  
                $wgOut->addHTML( $this->editFormTextBeforeContent );
  
-               if ( $this->contentModel === CONTENT_MODEL_WIKITEXT &&
-                       $showToolbar && $wgUser->getOption( 'showtoolbar' ) )
-               {
+               if ( !$this->isCssJsSubpage && $showToolbar && $wgUser->getOption( 'showtoolbar' ) ) {
                        $wgOut->addHTML( EditPage::getEditToolbar() );
                }
  
 +              if ( $this->blankArticle ) {
 +                      $wgOut->addHTML( Html::hidden( 'wpIgnoreBlankArticle', true ) );
 +              }
 +
                if ( $this->isConflict ) {
                        // In an edit conflict bypass the overridable content form method
                        // and fallback to the raw wpTextbox1 since editconflicts can't be
         * Extract the section title from current section text, if any.
         *
         * @param string $text
 -       * @return string|bool string or false
 +       * @return string|bool String or false
         */
        public static function extractSectionTitle( $text ) {
                preg_match( "/^(=+)(.+)\\1\\s*(\n|$)/i", $text, $matches );
         */
        protected function showHeader() {
                global $wgOut, $wgUser, $wgMaxArticleSize, $wgLang;
 +              global $wgAllowUserCss, $wgAllowUserJs;
  
                if ( $this->mTitle->isTalkPage() ) {
                        $wgOut->addWikiMsg( 'talkpagetext' );
                                $wgOut->wrapWikiMsg( "<div id='mw-missingcommentheader'>\n$1\n</div>", 'missingcommentheader' );
                        }
  
 +                      if ( $this->blankArticle ) {
 +                              $wgOut->wrapWikiMsg( "<div id='mw-blankarticle'>\n$1\n</div>", 'blankarticle' );
 +                      }
 +
                        if ( $this->hookError !== '' ) {
                                $wgOut->addWikiText( $this->hookError );
                        }
                        );
                } elseif ( $wgUser->isAnon() ) {
                        if ( $this->formtype != 'preview' ) {
 -                              $wgOut->wrapWikiMsg( "<div id=\"mw-anon-edit-warning\">\n$1</div>", 'anoneditwarning' );
 +                              $wgOut->wrapWikiMsg(
 +                                      "<div id='mw-anon-edit-warning'>\n$1\n</div>",
 +                                      array( 'anoneditwarning',
 +                                              // Log-in link
 +                                              '{{fullurl:Special:UserLogin|returnto={{FULLPAGENAMEE}}}}',
 +                                              // Sign-up link
 +                                              '{{fullurl:Special:UserLogin/signup|returnto={{FULLPAGENAMEE}}}}' )
 +                              );
                        } else {
 -                              $wgOut->wrapWikiMsg( "<div id=\"mw-anon-preview-warning\">\n$1</div>", 'anonpreviewwarning' );
 +                              $wgOut->wrapWikiMsg( "<div id=\"mw-anon-preview-warning\">\n$1</div>",
 +                                      'anonpreviewwarning'
 +                              );
                        }
                } else {
                        if ( $this->isCssJsSubpage ) {
                                        );
                                }
                                if ( $this->formtype !== 'preview' ) {
 -                                      if ( $this->isCssSubpage ) {
 +                                      if ( $this->isCssSubpage && $wgAllowUserCss ) {
                                                $wgOut->wrapWikiMsg(
                                                        "<div id='mw-usercssyoucanpreview'>\n$1\n</div>",
                                                        array( 'usercssyoucanpreview' )
                                                );
                                        }
  
 -                                      if ( $this->isJsSubpage ) {
 +                                      if ( $this->isJsSubpage && $wgAllowUserJs ) {
                                                $wgOut->wrapWikiMsg(
                                                        "<div id='mw-userjsyoucanpreview'>\n$1\n</div>",
                                                        array( 'userjsyoucanpreview' )
        }
  
        /**
 -       * @param bool $isSubjectPreview true if this is the section subject/title
 +       * @param bool $isSubjectPreview True if this is the section subject/title
         *   up top, or false if this is the comment summary
         *   down below the textarea
         * @param string $summary The text of the summary to display
 -       * @return string
         */
        protected function showSummaryInput( $isSubjectPreview, $summary = "" ) {
                global $wgOut, $wgContLang;
        }
  
        /**
 -       * @param bool $isSubjectPreview true if this is the section subject/title
 +       * @param bool $isSubjectPreview True if this is the section subject/title
         *   up top, or false if this is the comment summary
         *   down below the textarea
         * @param string $summary The text of the summary to display
@@@ -3113,7 -3195,6 +3111,7 @@@ HTM
         * Get the copyright warning
         *
         * Renamed to getCopyrightWarning(), old name kept around for backwards compatibility
 +       * @return string
         */
        protected function getCopywarn() {
                return self::getCopyrightWarning( $this->mTitle );
        }
  
        protected function showStandardInputs( &$tabindex = 2 ) {
 -              global $wgOut;
 +              global $wgOut, $wgUseMediaWikiUIEverywhere;
                $wgOut->addHTML( "<div class='editOptions'>\n" );
  
                if ( $this->section != 'new' ) {
  
                $message = wfMessage( 'edithelppage' )->inContentLanguage()->text();
                $edithelpurl = Skin::makeInternalOrExternalUrl( $message );
 -              $edithelp = '<a target="helpwindow" href="' . $edithelpurl . '">' .
 -                      wfMessage( 'edithelp' )->escaped() . '</a> ' .
 +              $attrs = array(
 +                      'target' => 'helpwindow',
 +                      'href' => $edithelpurl,
 +              );
 +              if ( $wgUseMediaWikiUIEverywhere ) {
 +                      $attrs['class'] = 'mw-ui-button mw-ui-quiet';
 +              }
 +              $edithelp = Html::element( 'a', $attrs, wfMessage( 'edithelp' )->text() ) .
                        wfMessage( 'newwindow' )->parse();
  
                $wgOut->addHTML( "      <span class='cancelLink'>{$cancel}</span>\n" );
         * @return string
         */
        public function getCancelLink() {
 +              global $wgUseMediaWikiUIEverywhere;
                $cancelParams = array();
                if ( !$this->isConflict && $this->oldid > 0 ) {
                        $cancelParams['oldid'] = $this->oldid;
                }
 +              $attrs = array( 'id' => 'mw-editform-cancel' );
 +              if ( $wgUseMediaWikiUIEverywhere ) {
 +                      $attrs['class'] = 'mw-ui-button mw-ui-quiet';
 +              }
  
                return Linker::linkKnown(
                        $this->getContextTitle(),
                        wfMessage( 'cancel' )->parse(),
 -                      array( 'id' => 'mw-editform-cancel' ),
 +                      $attrs,
                        $cancelParams
                );
        }
         */
        function getPreviewText() {
                global $wgOut, $wgUser, $wgRawHtml, $wgLang;
 +              global $wgAllowUserCss, $wgAllowUserJs;
  
                wfProfileIn( __METHOD__ );
  
  
                                if ( $content->getModel() == CONTENT_MODEL_CSS ) {
                                        $format = 'css';
 +                                      if ( $level === 'user' && !$wgAllowUserCss ) {
 +                                              $format = false;
 +                                      }
                                } elseif ( $content->getModel() == CONTENT_MODEL_JAVASCRIPT ) {
                                        $format = 'js';
 +                                      if ( $level === 'user' && !$wgAllowUserJs ) {
 +                                              $format = false;
 +                                      }
                                } else {
                                        $format = false;
                                }
  
                        $previewHTML = $parserOutput->getText();
                        $this->mParserOutput = $parserOutput;
 -                      $wgOut->addParserOutputNoText( $parserOutput );
 +                      $wgOut->addParserOutputMetadata( $parserOutput );
  
                        if ( count( $parserOutput->getWarnings() ) ) {
                                $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
        /**
         * Shows a bulletin board style toolbar for common editing functions.
         * It can be disabled in the user preferences.
 -       * The necessary JavaScript code can be found in skins/common/edit.js.
         *
         * @return string
         */
                 * inserted between the two when no selection is highlighted
                 * and.  The tip text is shown when the user moves the mouse
                 * over the button.
 -               *
 -               * Also here: accesskeys (key), which are not used yet until
 -               * someone can figure out a way to make them work in
 -               * IE. However, we should make sure these keys are not defined
 -               * on the edit page.
                 */
                $toolarray = array(
                        array(
                                'close'  => '\'\'\'',
                                'sample' => wfMessage( 'bold_sample' )->text(),
                                'tip'    => wfMessage( 'bold_tip' )->text(),
 -                              'key'    => 'B'
                        ),
                        array(
                                'image'  => $wgLang->getImageFile( 'button-italic' ),
                                'close'  => '\'\'',
                                'sample' => wfMessage( 'italic_sample' )->text(),
                                'tip'    => wfMessage( 'italic_tip' )->text(),
 -                              'key'    => 'I'
                        ),
                        array(
                                'image'  => $wgLang->getImageFile( 'button-link' ),
                                'close'  => ']]',
                                'sample' => wfMessage( 'link_sample' )->text(),
                                'tip'    => wfMessage( 'link_tip' )->text(),
 -                              'key'    => 'L'
                        ),
                        array(
                                'image'  => $wgLang->getImageFile( 'button-extlink' ),
                                'close'  => ']',
                                'sample' => wfMessage( 'extlink_sample' )->text(),
                                'tip'    => wfMessage( 'extlink_tip' )->text(),
 -                              'key'    => 'X'
                        ),
                        array(
                                'image'  => $wgLang->getImageFile( 'button-headline' ),
                                'close'  => " ==\n",
                                'sample' => wfMessage( 'headline_sample' )->text(),
                                'tip'    => wfMessage( 'headline_tip' )->text(),
 -                              'key'    => 'H'
                        ),
                        $imagesAvailable ? array(
                                'image'  => $wgLang->getImageFile( 'button-image' ),
                                'close'  => ']]',
                                'sample' => wfMessage( 'image_sample' )->text(),
                                'tip'    => wfMessage( 'image_tip' )->text(),
 -                              'key'    => 'D',
                        ) : false,
                        $imagesAvailable ? array(
                                'image'  => $wgLang->getImageFile( 'button-media' ),
                                'close'  => ']]',
                                'sample' => wfMessage( 'media_sample' )->text(),
                                'tip'    => wfMessage( 'media_tip' )->text(),
 -                              'key'    => 'M'
                        ) : false,
                        array(
                                'image'  => $wgLang->getImageFile( 'button-nowiki' ),
                                'close'  => "</nowiki>",
                                'sample' => wfMessage( 'nowiki_sample' )->text(),
                                'tip'    => wfMessage( 'nowiki_tip' )->text(),
 -                              'key'    => 'N'
                        ),
                        array(
                                'image'  => $wgLang->getImageFile( 'button-sig' ),
                                'close'  => '',
                                'sample' => '',
                                'tip'    => wfMessage( 'sig_tip' )->text(),
 -                              'key'    => 'Y'
                        ),
                        array(
                                'image'  => $wgLang->getImageFile( 'button-hr' ),
                                'close'  => '',
                                'sample' => '',
                                'tip'    => wfMessage( 'hr_tip' )->text(),
 -                              'key'    => 'R'
                        )
                );
  
         * @return array
         */
        public function getCheckboxes( &$tabindex, $checked ) {
 -              global $wgUser;
 +              global $wgUser, $wgUseMediaWikiUIEverywhere;
  
                $checkboxes = array();
  
                                        'accesskey' => wfMessage( 'accesskey-minoredit' )->text(),
                                        'id' => 'wpMinoredit',
                                );
 -                              $checkboxes['minor'] =
 +                              $minorEditHtml =
                                        Xml::check( 'wpMinoredit', $checked['minor'], $attribs ) .
                                        "&#160;<label for='wpMinoredit' id='mw-editpage-minoredit'" .
                                        Xml::expandAttributes( array( 'title' => Linker::titleAttrib( 'minoredit', 'withaccess' ) ) ) .
                                        ">{$minorLabel}</label>";
 +
 +                              if ( $wgUseMediaWikiUIEverywhere ) {
 +                                      $checkboxes['minor'] = Html::openElement( 'div', array( 'class' => 'mw-ui-checkbox' ) ) .
 +                                              $minorEditHtml .
 +                                      Html::closeElement( 'div' );
 +                              } else {
 +                                      $checkboxes['minor'] = $minorEditHtml;
 +                              }
                        }
                }
  
                                'accesskey' => wfMessage( 'accesskey-watch' )->text(),
                                'id' => 'wpWatchthis',
                        );
 -                      $checkboxes['watch'] =
 +                      $watchThisHtml =
                                Xml::check( 'wpWatchthis', $checked['watch'], $attribs ) .
                                "&#160;<label for='wpWatchthis' id='mw-editpage-watch'" .
                                Xml::expandAttributes( array( 'title' => Linker::titleAttrib( 'watch', 'withaccess' ) ) ) .
                                ">{$watchLabel}</label>";
 +                      if ( $wgUseMediaWikiUIEverywhere ) {
 +                              $checkboxes['watch'] = Html::openElement( 'div', array( 'class' => 'mw-ui-checkbox' ) ) .
 +                                      $watchThisHtml .
 +                                      Html::closeElement( 'div' );
 +                      } else {
 +                              $checkboxes['watch'] = $watchThisHtml;
 +                      }
                }
                wfRunHooks( 'EditPageBeforeEditChecks', array( &$this, &$checkboxes, &$tabindex ) );
                return $checkboxes;
         * @return array
         */
        public function getEditButtons( &$tabindex ) {
 +              global $wgUseMediaWikiUIEverywhere;
 +
                $buttons = array();
  
 -              // @todo FIXME: Hardcoded square brackets.
 -              $temp = array(
 +              $attribs = array(
                        'id' => 'wpSave',
                        'name' => 'wpSave',
                        'type' => 'submit',
                        'tabindex' => ++$tabindex,
                        'value' => wfMessage( 'savearticle' )->text(),
 -                      'accesskey' => wfMessage( 'accesskey-save' )->text(),
 -                      'title' => wfMessage( 'tooltip-save' )->text()
 -                              . ' [' . wfMessage( 'accesskey-save' )->text() . ']',
 -              );
 -              $buttons['save'] = Xml::element( 'input', $temp, '' );
 +              ) + Linker::tooltipAndAccesskeyAttribs( 'save' );
 +              if ( $wgUseMediaWikiUIEverywhere ) {
 +                      $attribs['class'] = 'mw-ui-button mw-ui-constructive';
 +              }
 +              $buttons['save'] = Xml::element( 'input', $attribs, '' );
  
                ++$tabindex; // use the same for preview and live preview
 -              // @todo FIXME: Hardcoded square brackets.
 -              $temp = array(
 +              $attribs = array(
                        'id' => 'wpPreview',
                        'name' => 'wpPreview',
                        'type' => 'submit',
                        'tabindex' => $tabindex,
                        'value' => wfMessage( 'showpreview' )->text(),
 -                      'accesskey' => wfMessage( 'accesskey-preview' )->text(),
 -                      'title' => wfMessage( 'tooltip-preview' )->text()
 -                              . ' [' . wfMessage( 'accesskey-preview' )->text() . ']',
 -              );
 -              $buttons['preview'] = Xml::element( 'input', $temp, '' );
 +              ) + Linker::tooltipAndAccesskeyAttribs( 'preview' );
 +              if ( $wgUseMediaWikiUIEverywhere ) {
 +                      $attribs['class'] = 'mw-ui-button mw-ui-progressive';
 +              }
 +              $buttons['preview'] = Xml::element( 'input', $attribs, '' );
                $buttons['live'] = '';
  
 -              // @todo FIXME: Hardcoded square brackets.
 -              $temp = array(
 +              $attribs = array(
                        'id' => 'wpDiff',
                        'name' => 'wpDiff',
                        'type' => 'submit',
                        'tabindex' => ++$tabindex,
                        'value' => wfMessage( 'showdiff' )->text(),
 -                      'accesskey' => wfMessage( 'accesskey-diff' )->text(),
 -                      'title' => wfMessage( 'tooltip-diff' )->text()
 -                              . ' [' . wfMessage( 'accesskey-diff' )->text() . ']',
 -              );
 -              $buttons['diff'] = Xml::element( 'input', $temp, '' );
 +              ) + Linker::tooltipAndAccesskeyAttribs( 'diff' );
 +              if ( $wgUseMediaWikiUIEverywhere ) {
 +                      $attribs['class'] = 'mw-ui-button mw-ui-progressive';
 +              }
 +              $buttons['diff'] = Xml::element( 'input', $attribs, '' );
  
                wfRunHooks( 'EditPageBeforeEditButtons', array( &$this, &$buttons, &$tabindex ) );
                return $buttons;
                echo $s;
        }
  
 -      /**
 -       * Call the stock "user is blocked" page
 -       *
 -       * @deprecated since 1.19; throw an exception directly instead
 -       */
 -      function blockedPage() {
 -              wfDeprecated( __METHOD__, '1.19' );
 -              global $wgUser;
 -
 -              throw new UserBlockedError( $wgUser->getBlock() );
 -      }
 -
 -      /**
 -       * Produce the stock "please login to edit pages" page
 -       *
 -       * @deprecated since 1.19; throw an exception directly instead
 -       */
 -      function userNotLoggedInPage() {
 -              wfDeprecated( __METHOD__, '1.19' );
 -              throw new PermissionsError( 'edit' );
 -      }
 -
 -      /**
 -       * Show an error page saying to the user that he has insufficient permissions
 -       * to create a new page
 -       *
 -       * @deprecated since 1.19; throw an exception directly instead
 -       */
 -      function noCreatePermission() {
 -              wfDeprecated( __METHOD__, '1.19' );
 -              $permission = $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage';
 -              throw new PermissionsError( $permission );
 -      }
 -
        /**
         * Creates a basic error page which informs the user that
         * they have attempted to edit a nonexistent section.