| Index: background.js | 
| =================================================================== | 
| --- a/background.js | 
| +++ b/background.js | 
| @@ -71,7 +71,6 @@ | 
| blockedURLs: "", | 
| filterlistsReinitialized: false, | 
| addSubscription: false, | 
| - filterError: false, | 
| downloadStatus: "synchronize_ok", | 
| showNotificationUI: false, | 
| showPageOptions: false | 
| @@ -313,7 +312,10 @@ | 
| { | 
| this.text = text; | 
| this.disabled = false; | 
| + if (Filter.elemhideRegExp.test(text)) | 
| + this.selector = RegExp.$3; | 
| } | 
| + Filter.elemhideRegExp = /^([^/*|@"!]*?)#([@?])?#(.+)$/; | 
| Filter.fromText = (text) => new Filter(text); | 
| function BlockingFilter() | 
| @@ -331,24 +333,65 @@ | 
| RegExpFilter | 
| }; | 
| + const isValidCSSSelector = selector => | 
| + { | 
| + if (!selector) | 
| + return true; | 
| + try | 
| + { | 
| + document.documentElement.matches(selector); | 
| + return true; | 
| + } | 
| + catch (error) | 
| + { | 
| + return false; | 
| + } | 
| + }; | 
| + | 
| modules.filterValidation = | 
| { | 
| + // to test failing filters | 
| + // use one or more bad CSS selectors | 
| + // or start the line with a [ | 
| parseFilter(text) | 
| { | 
| - if (params.filterError) | 
| - return {error: "Invalid filter"}; | 
| - return {filter: modules.filterClasses.Filter.fromText(text)}; | 
| + let filter = null; | 
| + if (text) | 
| + { | 
| + if (text[0] == "[") | 
| + return {error: {reason: "Unexpected filter list header"}}; | 
| + | 
| + filter = modules.filterClasses.Filter.fromText(text); | 
| + | 
| + if (!isValidCSSSelector(filter.selector)) | 
| + { | 
| + return {error: {reason: "Invalid CSS selector"}}; | 
| + } | 
| + } | 
| + | 
| + return {filter}; | 
| }, | 
| parseFilters(text) | 
| { | 
| - if (params.filterError) | 
| - return {errors: ["Invalid filter"]}; | 
| - return { | 
| - filters: text.split("\n") | 
| - .filter((filter) => !!filter) | 
| - .map(modules.filterClasses.Filter.fromText), | 
| - errors: [] | 
| - }; | 
| + let lines = text.split("\n"); | 
| + let filters = []; | 
| + let errors = []; | 
| + | 
| + for (let i = 0; i < lines.length; i++) | 
| + { | 
| + let {filter, error} = this.parseFilter(lines[i]); | 
| + | 
| + if (filter) | 
| + filters.push(filter); | 
| + | 
| + if (error) | 
| + { | 
| + error.lineno = i + 1; | 
| + errors.push(error); | 
| + } | 
| + } | 
| + | 
| + return {filters, errors}; | 
| } | 
| }; |