Skip to content

Commit 299e8ee

Browse files
Add an extra check over filter type
1 parent d7d538a commit 299e8ee

File tree

4 files changed

+92
-4
lines changed

4 files changed

+92
-4
lines changed

src/librustdoc/html/static/js/search.js

+30-3
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,18 @@ window.initSearch = function(rawSearchIndex) {
235235
* @return {boolean}
236236
*/
237237
function isSeparatorCharacter(c) {
238-
return ", \t".indexOf(c) !== -1;
238+
return c === "," || isWhitespaceCharacter(c);
239+
}
240+
241+
/**
242+
* Returns `true` if the given `c` character is a whitespace.
243+
*
244+
* @param {string} c
245+
*
246+
* @return {boolean}
247+
*/
248+
function isWhitespaceCharacter(c) {
249+
return c === " " || c === "\t";
239250
}
240251

241252
/**
@@ -424,6 +435,22 @@ window.initSearch = function(rawSearchIndex) {
424435
parserState.pos += 1;
425436
}
426437

438+
/**
439+
* Checks that the type filter doesn't have unwanted characters like `<>` (which are ignored
440+
* if empty).
441+
*
442+
* @param {ParserState} parserState
443+
*/
444+
function checkExtraTypeFilterCharacters(parserState) {
445+
var query = parserState.userQuery;
446+
447+
for (var pos = 0; pos < parserState.pos; ++pos) {
448+
if (!isIdentCharacter(query[pos]) && !isWhitespaceCharacter(query[pos])) {
449+
throw new Error(`Unexpected \`${query[pos]}\` in type filter`);
450+
}
451+
}
452+
}
453+
427454
/**
428455
* Parses the provided `query` input to fill `parserState`. If it encounters an error while
429456
* parsing `query`, it'll throw an error.
@@ -457,10 +484,10 @@ window.initSearch = function(rawSearchIndex) {
457484
throw new Error("Expected type filter before `:`");
458485
} else if (query.elems.length !== 1 || parserState.totalElems !== 1) {
459486
throw new Error("Unexpected `:`");
460-
}
461-
if (query.literalSearch) {
487+
} else if (query.literalSearch) {
462488
throw new Error("You cannot use quotes on type filter");
463489
}
490+
checkExtraTypeFilterCharacters(parserState);
464491
// The type filter doesn't count as an element since it's a modifier.
465492
parserState.typeFilter = query.elems.pop().name;
466493
parserState.pos += 1;

src/test/rustdoc-js-std/parser-errors.js

+40
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ const QUERY = [
3030
"a<->",
3131
"a:: a",
3232
"a ::a",
33+
"a<a>:",
34+
"a<>:",
35+
"a,:",
36+
" a<> :",
3337
];
3438

3539
const PARSED = [
@@ -312,4 +316,40 @@ const PARSED = [
312316
userQuery: 'a ::a',
313317
error: 'Paths cannot start with `::`',
314318
},
319+
{
320+
elems: [],
321+
foundElems: 0,
322+
original: "a<a>:",
323+
returned: [],
324+
typeFilter: -1,
325+
userQuery: "a<a>:",
326+
error: 'Unexpected `:`',
327+
},
328+
{
329+
elems: [],
330+
foundElems: 0,
331+
original: "a<>:",
332+
returned: [],
333+
typeFilter: -1,
334+
userQuery: "a<>:",
335+
error: 'Unexpected `<` in type filter',
336+
},
337+
{
338+
elems: [],
339+
foundElems: 0,
340+
original: "a,:",
341+
returned: [],
342+
typeFilter: -1,
343+
userQuery: "a,:",
344+
error: 'Unexpected `,` in type filter',
345+
},
346+
{
347+
elems: [],
348+
foundElems: 0,
349+
original: "a<> :",
350+
returned: [],
351+
typeFilter: -1,
352+
userQuery: "a<> :",
353+
error: 'Unexpected `<` in type filter',
354+
},
315355
];

src/test/rustdoc-js-std/parser-weird-queries.js

+20
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ const QUERY = [
77
'a,b(c)',
88
'aaa,a',
99
',,,,',
10+
'mod :',
11+
'mod\t:',
1012
];
1113

1214
const PARSED = [
@@ -100,4 +102,22 @@ const PARSED = [
100102
userQuery: ",,,,",
101103
error: null,
102104
},
105+
{
106+
elems: [],
107+
foundElems: 0,
108+
original: 'mod :',
109+
returned: [],
110+
typeFilter: 0,
111+
userQuery: 'mod :',
112+
error: null,
113+
},
114+
{
115+
elems: [],
116+
foundElems: 0,
117+
original: 'mod\t:',
118+
returned: [],
119+
typeFilter: 0,
120+
userQuery: 'mod\t:',
121+
error: null,
122+
},
103123
];

src/tools/rustdoc-js/tester.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,8 @@ function loadSearchJsAndIndex(searchJs, searchIndex, storageJs, crate) {
275275
"parseInput", "getItemsBefore", "getNextElem", "createQueryElement",
276276
"isReturnArrow", "isPathStart", "getStringElem", "newParsedQuery",
277277
"itemTypeFromName", "isEndCharacter", "isErrorCharacter",
278-
"isIdentCharacter", "isSeparatorCharacter", "getIdentEndPosition"];
278+
"isIdentCharacter", "isSeparatorCharacter", "getIdentEndPosition",
279+
"checkExtraTypeFilterCharacters", "isWhitespaceCharacter"];
279280

280281
const functions = ["hasOwnPropertyRustdoc", "onEach"];
281282
ALIASES = {};

0 commit comments

Comments
 (0)