Index: branches/wmf/1.17wmf1/extensions/NewUserMessage/NewUserMessage.class.php |
— | — | @@ -84,11 +84,14 @@ |
85 | 85 | */ |
86 | 86 | static function fetchText() { |
87 | 87 | $template = wfMsg( 'newusermessage-template-body' ); |
| 88 | + |
| 89 | + $title = Title::newFromText( $template ); |
| 90 | + if ( $title && $title->exists() && $title->getLength() ) { |
| 91 | + return $template; |
| 92 | + } |
| 93 | + |
88 | 94 | // Fall back if necessary to the old template |
89 | | - if ( !$template ) { |
90 | | - $template = wfMsg( 'newusermessage-template' ); |
91 | | - } |
92 | | - return $template; |
| 95 | + return wfMsg( 'newusermessage-template' ); |
93 | 96 | } |
94 | 97 | |
95 | 98 | /** |
Index: branches/wmf/1.17wmf1/includes/parser/Parser.php |
— | — | @@ -3936,7 +3936,7 @@ |
3937 | 3937 | if ( $prevtoclevel > 0 && $prevtoclevel < $wgMaxTocLevel ) { |
3938 | 3938 | $toc .= $sk->tocUnindent( $prevtoclevel - 1 ); |
3939 | 3939 | } |
3940 | | - $toc = $sk->tocList( $toc ); |
| 3940 | + $toc = $sk->tocList( $toc, $this->mOptions->getUserLang() ); |
3941 | 3941 | $this->mOutput->setTOCHTML( $toc ); |
3942 | 3942 | } |
3943 | 3943 | |
Property changes on: branches/wmf/1.17wmf1/includes/parser/Parser.php |
___________________________________________________________________ |
Modified: svn:mergeinfo |
3944 | 3944 | Merged /trunk/phase3/includes/parser/Parser.php:r82696,83270,83284,83374,83390,83392,83402-83403,83410-83411,83420,83461,83463 |
Index: branches/wmf/1.17wmf1/includes/Linker.php |
— | — | @@ -1330,10 +1330,11 @@ |
1331 | 1331 | * Wraps the TOC in a table and provides the hide/collapse javascript. |
1332 | 1332 | * |
1333 | 1333 | * @param $toc String: html of the Table Of Contents |
| 1334 | + * @param $lang mixed: Language code for the toc title |
1334 | 1335 | * @return String: full html of the TOC |
1335 | 1336 | */ |
1336 | | - function tocList( $toc ) { |
1337 | | - $title = wfMsgHtml( 'toc' ) ; |
| 1337 | + function tocList( $toc, $lang = false ) { |
| 1338 | + $title = wfMsgExt( 'toc', array( 'language' => $lang, 'escape' ) ); |
1338 | 1339 | return |
1339 | 1340 | '<table id="toc" class="toc"><tr><td>' |
1340 | 1341 | . '<div id="toctitle"><h2>' . $title . "</h2></div>\n" |
Index: branches/wmf/1.17wmf1/includes/api/ApiQueryBase.php |
— | — | @@ -440,6 +440,36 @@ |
441 | 441 | return substr( $this->keyToTitle( $keyPart . 'x' ), 0, - 1 ); |
442 | 442 | } |
443 | 443 | |
| 444 | + /** |
| 445 | + * Filters hidden users (where the user doesn't have the right to view them) |
| 446 | + * Also adds relevant block information |
| 447 | + * |
| 448 | + * @param bool $showBlockInfo |
| 449 | + * @return void |
| 450 | + */ |
| 451 | + public function showHiddenUsersAddBlockInfo( $showBlockInfo ) { |
| 452 | + global $wgUser; |
| 453 | + $userCanViewHiddenUsers = $wgUser->isAllowed( 'hideuser' ); |
| 454 | + |
| 455 | + if ( $showBlockInfo || !$userCanViewHiddenUsers ) { |
| 456 | + $this->addTables( 'ipblocks' ); |
| 457 | + $this->addJoinConds( array( |
| 458 | + 'ipblocks' => array( 'LEFT JOIN', 'ipb_user=user_id' ), |
| 459 | + ) ); |
| 460 | + |
| 461 | + $this->addFields( 'ipb_deleted' ); |
| 462 | + |
| 463 | + if ( $showBlockInfo ) { |
| 464 | + $this->addFields( array( 'ipb_reason', 'ipb_by_text', 'ipb_expiry' ) ); |
| 465 | + } |
| 466 | + |
| 467 | + // Don't show hidden names |
| 468 | + if ( !$userCanViewHiddenUsers ) { |
| 469 | + $this->addWhereFld( 'ipb_deleted', 0 ); |
| 470 | + } |
| 471 | + } |
| 472 | + } |
| 473 | + |
444 | 474 | public function getPossibleErrors() { |
445 | 475 | return array_merge( parent::getPossibleErrors(), array( |
446 | 476 | array( 'invalidtitle', 'title' ), |
Index: branches/wmf/1.17wmf1/includes/api/ApiQueryFilearchive.php |
— | — | @@ -66,7 +66,7 @@ |
67 | 67 | |
68 | 68 | $this->addTables( 'filearchive' ); |
69 | 69 | |
70 | | - $this->addFields( 'fa_name' ); |
| 70 | + $this->addFields( array( 'fa_name', 'fa_deleted' ) ); |
71 | 71 | $this->addFieldsIf( 'fa_storage_key', $fld_sha1 ); |
72 | 72 | $this->addFieldsIf( 'fa_timestamp', $fld_timestamp ); |
73 | 73 | |
— | — | @@ -92,27 +92,22 @@ |
93 | 93 | $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' ); |
94 | 94 | $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) ); |
95 | 95 | $this->addWhereRange( 'fa_name', $dir, $from, null ); |
96 | | - if ( isset( $params['prefix'] ) ) |
| 96 | + if ( isset( $params['prefix'] ) ) { |
97 | 97 | $this->addWhere( 'fa_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) ); |
98 | | - |
99 | | - if ( isset( $params['minsize'] ) ) { |
100 | | - $this->addWhere( 'fa_size>=' . intval( $params['minsize'] ) ); |
101 | 98 | } |
102 | | - |
103 | | - if ( isset( $params['maxsize'] ) ) { |
104 | | - $this->addWhere( 'fa_size<=' . intval( $params['maxsize'] ) ); |
| 99 | + |
| 100 | + if ( !$wgUser->isAllowed( 'suppressrevision' ) ) { |
| 101 | + // Filter out revisions that the user is not allowed to see. There |
| 102 | + // is no way to indicate that we have skipped stuff because the |
| 103 | + // continuation parameter is fa_name |
| 104 | + |
| 105 | + // Note that this field is unindexed. This should however not be |
| 106 | + // a big problem as files with fa_deleted are rare |
| 107 | + $this->addWhereFld( 'fa_deleted', 0 ); |
105 | 108 | } |
106 | 109 | |
107 | | - $sha1 = false; |
108 | | - if ( isset( $params['sha1'] ) ) { |
109 | | - $sha1 = wfBaseConvert( $params['sha1'], 16, 36, 31 ); |
110 | | - } elseif ( isset( $params['sha1base36'] ) ) { |
111 | | - $sha1 = $params['sha1base36']; |
112 | | - } |
113 | | - if ( $sha1 ) { |
114 | | - $this->addWhere( 'fa_storage_key=' . $db->addQuotes( $sha1 ) ); |
115 | | - } |
116 | | - |
| 110 | + |
| 111 | + |
117 | 112 | $limit = $params['limit']; |
118 | 113 | $this->addOption( 'LIMIT', $limit + 1 ); |
119 | 114 | $this->addOption( 'ORDER BY', 'fa_name' . |
— | — | @@ -162,7 +157,22 @@ |
163 | 158 | if ( $fld_mime ) { |
164 | 159 | $file['mime'] = "$row->fa_major_mime/$row->fa_minor_mime"; |
165 | 160 | } |
| 161 | + |
| 162 | + if ( $row->fa_deleted & File::DELETED_FILE ) { |
| 163 | + $file['filehidden'] = ''; |
| 164 | + } |
| 165 | + if ( $row->fa_deleted & File::DELETED_COMMENT ) { |
| 166 | + $file['commenthidden'] = ''; |
| 167 | + } |
| 168 | + if ( $row->fa_deleted & File::DELETED_USER ) { |
| 169 | + $file['userhidden'] = ''; |
| 170 | + } |
| 171 | + if ( $row->fa_deleted & File::DELETED_RESTRICTED ) { |
| 172 | + // This file is deleted for normal admins |
| 173 | + $file['suppressed'] = ''; |
| 174 | + } |
166 | 175 | |
| 176 | + |
167 | 177 | $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $file ); |
168 | 178 | if ( !$fit ) { |
169 | 179 | $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->fa_name ) ); |
— | — | @@ -177,12 +187,6 @@ |
178 | 188 | return array ( |
179 | 189 | 'from' => null, |
180 | 190 | 'prefix' => null, |
181 | | - 'minsize' => array( |
182 | | - ApiBase::PARAM_TYPE => 'integer', |
183 | | - ), |
184 | | - 'maxsize' => array( |
185 | | - ApiBase::PARAM_TYPE => 'integer', |
186 | | - ), |
187 | 191 | 'limit' => array( |
188 | 192 | ApiBase::PARAM_DFLT => 10, |
189 | 193 | ApiBase::PARAM_TYPE => 'limit', |
— | — | @@ -197,8 +201,6 @@ |
198 | 202 | 'descending' |
199 | 203 | ) |
200 | 204 | ), |
201 | | - 'sha1' => null, |
202 | | - 'sha1base36' => null, |
203 | 205 | 'prop' => array( |
204 | 206 | ApiBase::PARAM_DFLT => 'timestamp', |
205 | 207 | ApiBase::PARAM_ISMULTI => true, |
— | — | @@ -222,11 +224,7 @@ |
223 | 225 | 'from' => 'The image title to start enumerating from', |
224 | 226 | 'prefix' => 'Search for all image titles that begin with this value', |
225 | 227 | 'dir' => 'The direction in which to list', |
226 | | - 'minsize' => 'Limit to images with at least this many bytes', |
227 | | - 'maxsize' => 'Limit to images with at most this many bytes', |
228 | 228 | 'limit' => 'How many total images to return', |
229 | | - 'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36", |
230 | | - 'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)', |
231 | 229 | 'prop' => array( |
232 | 230 | 'What image information to get:', |
233 | 231 | ' sha1 - Adds sha1 hash for the image', |
Index: branches/wmf/1.17wmf1/includes/api/ApiEmailUser.php |
— | — | @@ -63,6 +63,17 @@ |
64 | 64 | 'CCMe' => $params['ccme'], |
65 | 65 | ); |
66 | 66 | $retval = SpecialEmailUser::submit( $data ); |
| 67 | + |
| 68 | + if ( $retval instanceof Status ) { |
| 69 | + // SpecialEmailUser sometimes returns a status |
| 70 | + // sometimes it doesn't. |
| 71 | + if ( $retval->isGood() ) { |
| 72 | + $retval = true; |
| 73 | + } else { |
| 74 | + $retval = $retval->getErrorsArray(); |
| 75 | + } |
| 76 | + } |
| 77 | + |
67 | 78 | if ( $retval === true ) { |
68 | 79 | $result = array( 'result' => 'Success' ); |
69 | 80 | } else { |
Index: branches/wmf/1.17wmf1/includes/api/ApiQueryAllUsers.php |
— | — | @@ -96,15 +96,7 @@ |
97 | 97 | } else { |
98 | 98 | $sqlLimit = $limit + 1; |
99 | 99 | } |
100 | | - if ( $fld_blockinfo ) { |
101 | | - $this->addTables( 'ipblocks' ); |
102 | | - $this->addTables( 'user', 'u2' ); |
103 | | - $u2 = $this->getAliasedName( 'user', 'u2' ); |
104 | | - $this->addJoinConds( array( |
105 | | - 'ipblocks' => array( 'LEFT JOIN', 'ipb_user=u1.user_id' ), |
106 | | - $u2 => array( 'LEFT JOIN', 'ipb_by=u2.user_id' ) ) ); |
107 | | - $this->addFields( array( 'ipb_reason', 'u2.user_name AS blocker_name' ) ); |
108 | | - } |
| 100 | + $this->showHiddenUsersAddBlockInfo( $fld_blockinfo ); |
109 | 101 | |
110 | 102 | $this->addOption( 'LIMIT', $sqlLimit ); |
111 | 103 | |
— | — | @@ -169,6 +161,9 @@ |
170 | 162 | $lastUserData['blockedby'] = $row->blocker_name; |
171 | 163 | $lastUserData['blockreason'] = $row->ipb_reason; |
172 | 164 | } |
| 165 | + if ( $row->ipb_deleted ) { |
| 166 | + $lastUserData['hidden'] = ''; |
| 167 | + } |
173 | 168 | if ( $fld_editcount ) { |
174 | 169 | $lastUserData['editcount'] = intval( $row->user_editcount ); |
175 | 170 | } |
— | — | @@ -206,7 +201,7 @@ |
207 | 202 | } |
208 | 203 | |
209 | 204 | public function getCacheMode( $params ) { |
210 | | - return 'public'; |
| 205 | + return 'anon-public-user-private'; |
211 | 206 | } |
212 | 207 | |
213 | 208 | public function getAllowedParams() { |
Index: branches/wmf/1.17wmf1/includes/api/ApiQueryUsers.php |
— | — | @@ -114,16 +114,9 @@ |
115 | 115 | $this->addJoinConds( array( 'user_groups' => array( 'LEFT JOIN', 'ug_user=u1.user_id' ) ) ); |
116 | 116 | $this->addFields( 'ug_group' ); |
117 | 117 | } |
118 | | - if ( isset( $this->prop['blockinfo'] ) ) { |
119 | | - $this->addTables( 'ipblocks' ); |
120 | | - $this->addTables( 'user', 'u2' ); |
121 | | - $u2 = $this->getAliasedName( 'user', 'u2' ); |
122 | | - $this->addJoinConds( array( |
123 | | - 'ipblocks' => array( 'LEFT JOIN', 'ipb_user=u1.user_id' ), |
124 | | - $u2 => array( 'LEFT JOIN', 'ipb_by=u2.user_id' ) ) ); |
125 | | - $this->addFields( array( 'ipb_reason', 'u2.user_name AS blocker_name', 'ipb_expiry' ) ); |
126 | | - } |
127 | 118 | |
| 119 | + $this->showHiddenUsersAddBlockInfo( isset( $this->prop['blockinfo'] ) ); |
| 120 | + |
128 | 121 | $data = array(); |
129 | 122 | $res = $this->select( __METHOD__ ); |
130 | 123 | foreach ( $res as $row ) { |
— | — | @@ -144,8 +137,20 @@ |
145 | 138 | $data[$name]['groups'][] = $row->ug_group; |
146 | 139 | } |
147 | 140 | |
148 | | - if ( isset( $this->prop['blockinfo'] ) && !is_null( $row->blocker_name ) ) { |
149 | | - $data[$name]['blockedby'] = $row->blocker_name; |
| 141 | + if ( isset( $this->prop['rights'] ) && !is_null( $row->ug_group ) ) { |
| 142 | + if ( !isset( $data[$name]['rights'] ) ) { |
| 143 | + $data[$name]['rights'] = User::getGroupPermissions( User::getImplicitGroups() ); |
| 144 | + } |
| 145 | + |
| 146 | + $data[$name]['rights'] = array_unique( array_merge( $data[$name]['rights'], |
| 147 | + User::getGroupPermissions( array( $row->ug_group ) ) ) ); |
| 148 | + $result->setIndexedTagName( $data[$name]['rights'], 'r' ); |
| 149 | + } |
| 150 | + if ( $row->ipb_deleted ) { |
| 151 | + $data[$name]['hidden'] = ''; |
| 152 | + } |
| 153 | + if ( isset( $this->prop['blockinfo'] ) && !is_null( $row->ipb_by_text ) ) { |
| 154 | + $data[$name]['blockedby'] = $row->ipb_by_text; |
150 | 155 | $data[$name]['blockreason'] = $row->ipb_reason; |
151 | 156 | $data[$name]['blockexpiry'] = $row->ipb_expiry; |
152 | 157 | } |
— | — | @@ -239,7 +244,7 @@ |
240 | 245 | if ( isset( $params['token'] ) ) { |
241 | 246 | return 'private'; |
242 | 247 | } else { |
243 | | - return 'public'; |
| 248 | + return 'anon-public-user-private'; |
244 | 249 | } |
245 | 250 | } |
246 | 251 | |
Index: branches/wmf/1.17wmf1/includes/media/Generic.php |
— | — | @@ -81,7 +81,8 @@ |
82 | 82 | /** |
83 | 83 | * Get handler-specific metadata which will be saved in the img_metadata field. |
84 | 84 | * |
85 | | - * @param $image File: the image object, or false if there isn't one |
| 85 | + * @param $image File: the image object, or false if there isn't one. |
| 86 | + * Warning, File::getPropsFromPath might pass an (object)array() instead (!) |
86 | 87 | * @param $path String: the filename |
87 | 88 | * @return String |
88 | 89 | */ |
Index: branches/wmf/1.17wmf1/includes/media/SVGMetadataExtractor.php |
— | — | @@ -47,13 +47,40 @@ |
48 | 48 | * @param $source String: URI from which to read |
49 | 49 | */ |
50 | 50 | function __construct( $source ) { |
| 51 | + global $wgSVGMetadataCutoff; |
51 | 52 | $this->reader = new XMLReader(); |
52 | | - $this->reader->open( $source, null, LIBXML_NOERROR | LIBXML_NOWARNING ); |
53 | 53 | |
| 54 | + // Don't use $file->getSize() since file object passed to SVGHandler::getMetadata is bogus. |
| 55 | + $size = filesize( $source ); |
| 56 | + if ( $size === false ) { |
| 57 | + throw new MWException( "Error getting filesize of SVG." ); |
| 58 | + } |
| 59 | + |
| 60 | + if ( $size > $wgSVGMetadataCutoff ) { |
| 61 | + $this->debug( "SVG is $size bytes, which is bigger than $wgSVGMetadataCutoff. Truncating." ); |
| 62 | + $contents = file_get_contents( $source, false, null, -1, $wgSVGMetadataCutoff ); |
| 63 | + if ($contents === false) { |
| 64 | + throw new MWException( 'Error reading SVG file.' ); |
| 65 | + } |
| 66 | + $this->reader->XML( $contents, null, LIBXML_NOERROR | LIBXML_NOWARNING ); |
| 67 | + } else { |
| 68 | + $this->reader->open( $source, null, LIBXML_NOERROR | LIBXML_NOWARNING ); |
| 69 | + } |
| 70 | + |
54 | 71 | $this->metadata['width'] = self::DEFAULT_WIDTH; |
55 | 72 | $this->metadata['height'] = self::DEFAULT_HEIGHT; |
56 | 73 | |
57 | | - $this->read(); |
| 74 | + // Because we cut off the end of the svg making an invalid one. Complicated |
| 75 | + // try catch thing to make sure warnings get restored. Seems like there should |
| 76 | + // be a better way. |
| 77 | + wfSuppressWarnings(); |
| 78 | + try { |
| 79 | + $this->read(); |
| 80 | + } catch( Exception $e ) { |
| 81 | + wfRestoreWarnings(); |
| 82 | + throw $e; |
| 83 | + } |
| 84 | + wfRestoreWarnings(); |
58 | 85 | } |
59 | 86 | |
60 | 87 | /* |
— | — | @@ -83,7 +110,6 @@ |
84 | 111 | |
85 | 112 | $exitDepth = $this->reader->depth; |
86 | 113 | $keepReading = $this->reader->read(); |
87 | | - $skip = false; |
88 | 114 | while ( $keepReading ) { |
89 | 115 | $tag = $this->reader->name; |
90 | 116 | $type = $this->reader->nodeType; |
— | — | @@ -100,17 +126,15 @@ |
101 | 127 | $this->readXml( $tag, 'metadata' ); |
102 | 128 | } elseif ( $tag !== '#text' ) { |
103 | 129 | $this->debug( "Unhandled top-level XML tag $tag" ); |
104 | | - $this->animateFilter( $tag ); |
105 | | - //$skip = true; |
| 130 | + |
| 131 | + if ( !isset( $this->metadata['animated'] ) ) { |
| 132 | + // Recurse into children of current tag, looking for animation. |
| 133 | + $this->animateFilter( $tag ); |
| 134 | + } |
106 | 135 | } |
107 | 136 | |
108 | | - if ($skip) { |
109 | | - $keepReading = $this->reader->next(); |
110 | | - $skip = false; |
111 | | - $this->debug( "Skip" ); |
112 | | - } else { |
113 | | - $keepReading = $this->reader->read(); |
114 | | - } |
| 137 | + // Goto next element, which is sibling of current (Skip children). |
| 138 | + $keepReading = $this->reader->next(); |
115 | 139 | } |
116 | 140 | |
117 | 141 | $this->reader->close(); |
— | — | @@ -134,7 +158,7 @@ |
135 | 159 | if( $this->reader->name == $name && $this->reader->nodeType == XmlReader::END_ELEMENT ) { |
136 | 160 | break; |
137 | 161 | } elseif( $this->reader->nodeType == XmlReader::TEXT ){ |
138 | | - $this->metadata[$metafield] = $this->reader->value; |
| 162 | + $this->metadata[$metafield] = trim( $this->reader->value ); |
139 | 163 | } |
140 | 164 | $keepReading = $this->reader->read(); |
141 | 165 | } |
Index: branches/wmf/1.17wmf1/includes/DefaultSettings.php |
— | — | @@ -665,6 +665,9 @@ |
666 | 666 | $wgSVGConverterPath = ''; |
667 | 667 | /** Don't scale a SVG larger than this */ |
668 | 668 | $wgSVGMaxSize = 2048; |
| 669 | +/** Don't read SVG metadata beyond this point. |
| 670 | + * Default is 1024*256 bytes */ |
| 671 | +$wgSVGMetadataCutoff = 262144; |
669 | 672 | |
670 | 673 | /** |
671 | 674 | * MediaWiki will reject HTMLesque tags in uploaded files due to idiotic browsers which can't |
Property changes on: branches/wmf/1.17wmf1/includes/DefaultSettings.php |
___________________________________________________________________ |
Modified: svn:mergeinfo |
672 | 675 | Merged /trunk/phase3/includes/DefaultSettings.php:r82696,83270,83284,83374,83390,83392,83402-83403,83410-83411,83420,83461,83463 |
Index: branches/wmf/1.17wmf1/includes/specials/SpecialEmailuser.php |
— | — | @@ -221,7 +221,8 @@ |
222 | 222 | * getPermissionsError(). It is probably also a good |
223 | 223 | * idea to check the edit token and ping limiter in advance. |
224 | 224 | * |
225 | | - * @return Mixed: True on success, String on error |
| 225 | + * @return Mixed: Status object, or potentially a String on error |
| 226 | + * or maybe even true on success if anything uses the EmailUser hook. |
226 | 227 | */ |
227 | 228 | public static function submit( $data ) { |
228 | 229 | global $wgUser, $wgUserEmailUseReplyTo; |
Index: branches/wmf/1.17wmf1/RELEASE-NOTES |
— | — | @@ -101,6 +101,8 @@ |
102 | 102 | which should be resolved by the 1.18 release |
103 | 103 | * $wgCopyrightIcon is deprecated and $wgFooterIcons['copyright']['copyright'] should |
104 | 104 | be used instead. |
| 105 | +* (bug 27508) Add $wgSVGMetadataCutoff to limit the maximum amount of an svg we |
| 106 | + look at when finding metadata to prevent excessive resource usage. |
105 | 107 | |
106 | 108 | === New features in 1.17 === |
107 | 109 | * (bug 10183) Users can now add personal styles and scripts to all skins via |
— | — | @@ -505,7 +507,11 @@ |
506 | 508 | * (bug 27479) API error when using both prop=pageprops and |
507 | 509 | prop=info&inprop=displaytitle |
508 | 510 | * (bug 27715) imageinfo didn't respect revdelete |
509 | | - |
| 511 | +* (bug 27862) Useremail module didn't properly return success on success. |
| 512 | +* (bug 27590) prop=imageinfo now allows querying the media type |
| 513 | +* (bug 27587) list=filearchive now outputs full title info |
| 514 | +* (bug 27018) Added action=filerevert to revert files to an old version |
| 515 | +* (bug 27897) list=allusers and list=users list hidden users |
510 | 516 | * (bug 22738) Allow filtering by action type on query=logevent. |
511 | 517 | * (bug 22764) uselang parameter for action=parse. |
512 | 518 | * (bug 22944) API: watchlist options are inconsistent. |
Property changes on: branches/wmf/1.17wmf1/RELEASE-NOTES |
___________________________________________________________________ |
Modified: svn:mergeinfo |
513 | 519 | Merged /trunk/phase3/RELEASE-NOTES:r82696,83270,83284,83374,83390,83392,83402-83403,83410-83411,83420,83461,83463 |
Index: branches/wmf/1.17wmf1/resources/mediawiki.util/mediawiki.util.js |
— | — | @@ -235,7 +235,10 @@ |
236 | 236 | return null; |
237 | 237 | } |
238 | 238 | // Setup the anchor tag |
239 | | - var $link = $('<a />').attr( 'href', href ).text( text ); |
| 239 | + var $link = $( '<a></a>' ).attr( 'href', href ).text( text ); |
| 240 | + if ( tooltip ) { |
| 241 | + $link.attr( 'title', tooltip ); |
| 242 | + } |
240 | 243 | |
241 | 244 | // Some skins don't have any portlets |
242 | 245 | // just add it to the bottom of their 'sidebar' element as a fallback |
— | — | @@ -261,11 +264,11 @@ |
262 | 265 | if ($ul.length === 0) { |
263 | 266 | // If there's no <div> inside, append it to the portlet directly |
264 | 267 | if ($portlet.find( 'div' ).length === 0) { |
265 | | - $portlet.append( '<ul/>' ); |
| 268 | + $portlet.append( '<ul></ul>' ); |
266 | 269 | } else { |
267 | 270 | // otherwise if there's a div (such as div.body or div.pBody) |
268 | 271 | // append the <ul> to last (most likely only) div |
269 | | - $portlet.find( 'div' ).eq( -1 ).append( '<ul/>' ); |
| 272 | + $portlet.find( 'div' ).eq( -1 ).append( '<ul></ul>' ); |
270 | 273 | } |
271 | 274 | // Select the created element |
272 | 275 | $ul = $portlet.find( 'ul' ).eq( 0 ); |
— | — | @@ -280,7 +283,7 @@ |
281 | 284 | |
282 | 285 | // Wrap the anchor tag in a <span> and create a list item for it |
283 | 286 | // and back up the selector to the list item |
284 | | - var $item = $link.wrap( '<li><span /></li>' ).parent().parent(); |
| 287 | + var $item = $link.wrap( '<li><span></span></li>' ).parent().parent(); |
285 | 288 | |
286 | 289 | // Implement the properties passed to the function |
287 | 290 | if ( id ) { |
Index: branches/wmf/1.17wmf1/resources/mediawiki/mediawiki.js |
— | — | @@ -14,7 +14,7 @@ |
15 | 15 | return str.substr( 0, 1 ).toUpperCase() + str.substr( 1, str.length ); |
16 | 16 | }, |
17 | 17 | escapeRE : function( str ) { |
18 | | - return str.replace ( /([\\{}()|.?*+^$\[\]])/g, "\\$1" ); |
| 18 | + return str.replace ( /([\\{}()\|.?*+-^$\[\]])/g, "\\$1" ); |
19 | 19 | }, |
20 | 20 | isEmpty : function( v ) { |
21 | 21 | var key; |
Property changes on: branches/wmf/1.17wmf1/resources/mediawiki/mediawiki.js |
___________________________________________________________________ |
Modified: svn:mergeinfo |
22 | 22 | Merged /trunk/phase3/resources/mediawiki/mediawiki.js:r82696,83270,83284,83374,83390,83392,83402-83403,83410-83411,83420,83461,83463 |