blob: 7295bd93446a4e1d9a50ae16ccc81368bbaacec0 [file] [log] [blame]
// Copyright 2009 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Factory for constructing filters from deserialized objects.
* In this file, filters (whether their static factory methods or their class
* definitions) are ordered alphabetically.
*/
goog.provide('bidichecker.FilterFactory');
goog.require('bidichecker.Filter');
goog.require('goog.json');
/**
* Factory class that constructs error-suppression filters from bare objects
* deserialized from JSON.
* @constructor
* @export
*/
bidichecker.FilterFactory = function() {};
/**
* Abstract base class for custom filter classes, providing them with {@code
* and()}, {@code or()} and {@code not()} methods.
* @constructor
* @implements {bidichecker.Filter}
* @private
* @export
*/
bidichecker.FilterFactory.ComposableFilter_ = function() {};
/** @inheritDoc */
bidichecker.FilterFactory.ComposableFilter_.prototype.isSuppressed =
goog.abstractMethod;
/**
* Create a filter which ands this filter with another.
* @param {!bidichecker.Filter} other The second subfilter.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.ComposableFilter_.prototype.and = function(other) {
return bidichecker.FilterFactory.and(this, other);
};
/**
* Create a filter which inverts this filter.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.ComposableFilter_.prototype.not = function() {
return bidichecker.FilterFactory.not(this);
};
/**
* Create a filter which ors this filter with another.
* @param {!bidichecker.Filter} other The second subfilter.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.ComposableFilter_.prototype.or = function(other) {
return bidichecker.FilterFactory.or(this, other);
};
/**
* Constructs a suppression filter from a bare object with suitable contents.
* For use in deserializing filters from JSON. Throws a string exception if an
* invalid filter is encountered.
* @param {!Object} bareFilter The object representing the filter. Must contain
* an {@code 'opcode'} field with a string indicating the filter type.
* Other supported field names and types are dependent on the filter type.
* @return {!bidichecker.FilterFactory.ComposableFilter_} The new filter.
*/
bidichecker.FilterFactory.constructFilter = function(bareFilter) {
var opcode = bareFilter['opcode'];
switch (opcode) {
case 'AND':
return new bidichecker.FilterFactory.AndFilter_(bareFilter);
case 'AT_TEXT':
return new bidichecker.FilterFactory.AtTextFilter_(bareFilter);
case 'AT_TEXT_REGEXP':
return new bidichecker.FilterFactory.AtTextRegexpFilter_(bareFilter);
case 'FOLLOWED_BY_TEXT':
return new bidichecker.FilterFactory.FollowedByTextFilter_(bareFilter);
case 'FOLLOWED_BY_TEXT_REGEXP':
return new bidichecker.FilterFactory.FollowedByTextRegexpFilter_(
bareFilter);
case 'LOCATION_CLASS':
return new bidichecker.FilterFactory.LocationClassFilter_(bareFilter);
case 'LOCATION_CLASS_REGEXP':
return new bidichecker.FilterFactory.LocationClassRegexpFilter_(
bareFilter);
case 'LOCATION_ID':
return new bidichecker.FilterFactory.LocationIdFilter_(bareFilter);
case 'LOCATION_ID_REGEXP':
return new bidichecker.FilterFactory.LocationIdRegexpFilter_(
bareFilter);
case 'NOT':
return new bidichecker.FilterFactory.NotFilter_(bareFilter);
case 'OR':
return new bidichecker.FilterFactory.OrFilter_(bareFilter);
case 'PRECEDED_BY_TEXT':
return new bidichecker.FilterFactory.PrecededByTextFilter_(bareFilter);
case 'PRECEDED_BY_TEXT_REGEXP':
return new bidichecker.FilterFactory.PrecededByTextRegexpFilter_(
bareFilter);
case 'SEVERITY':
return new bidichecker.FilterFactory.SeverityFilter_(bareFilter);
case 'TYPE':
return new bidichecker.FilterFactory.TypeFilter_(bareFilter);
default:
throw 'Unknown filter opcode: \'' + opcode + '\'';
}
};
/**
* Deserializes a list of suppression filters from a JSON-format string.
* Throws a string exception if an unknown filter is encountered.
* @param {string=} opt_filtersJson The input string, if provided.
* @return {Array.<!bidichecker.Filter>} The error suppression filters.
*/
bidichecker.FilterFactory.readFiltersFromJson = function(opt_filtersJson) {
if (!opt_filtersJson) {
return null;
}
var bareFilters =
(/** @type {Array.<!Object>} */ goog.json.parse(opt_filtersJson));
return goog.array.map(bareFilters, function(bareFilter) {
return bidichecker.FilterFactory.constructFilter(bareFilter);
});
};
/**
* Create a filter which suppresses errors by and-ing component filters.
* @param {!bidichecker.Filter} filter1 The first subfilter.
* @param {!bidichecker.Filter} filter2 The second subfilter.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.and = function(filter1, filter2) {
return new bidichecker.FilterFactory.AndFilter_(
{'filter1': filter1, 'filter2': filter2});
};
/**
* Create a filter which suppresses errors based on a literal match of their
* {@code atText} fields.
* @param {?string} atText A string which must match the entire {@code atText}
* field. If empty or null, will only match an empty or null {@code atText}.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.atText = function(atText) {
return new bidichecker.FilterFactory.AtTextFilter_({'atText': atText || ''});
};
/**
* Create a filter which suppresses errors by applying a regular expression to
* their {@code atText} fields.
* @param {string|RegExp} atTextRegexp A regular expression, which must match
* the entire {@code atText} field. If empty or null, will only match an
* empty or null {@code atText}.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.atTextRegexp = function(atTextRegexp) {
return new bidichecker.FilterFactory.AtTextRegexpFilter_(
{'atTextRegexp': atTextRegexp || ''});
};
/**
* Create a filter which suppresses errors based on a literal match of their
* {@code followedByText} fields.
* @param {?string} followedByText A string which must match the entire {@code
* followedByText} field. If empty or null, will only match an empty or null
* {@code followedByText}.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.followedByText = function(followedByText) {
return new bidichecker.FilterFactory.FollowedByTextFilter_(
{'followedByText': followedByText || ''});
};
/**
* Create a filter which suppresses errors by applying a regular expression to
* their {@code followedByText} fields.
* @param {string|RegExp} followedByTextRegexp A regular expression, which must
* match the entire {@code followedByText} field. If empty or null, will
* only match an empty or null {@code followedByText}.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.followedByTextRegexp = function(
followedByTextRegexp) {
return new bidichecker.FilterFactory.FollowedByTextRegexpFilter_(
{'followedByTextRegexp': followedByTextRegexp || ''});
};
/**
* Create a filter which suppresses errors based on a literal match of one of
* the class names of any parent node of the error location in the DOM.
* @param {string} className A string which must match one of the class names in
* the {@code class} attribute of the location or one of its ancestors. Must
* not be empty or null.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.locationClass = function(className) {
if (!className || className == '') {
throw 'Empty or null argument to bidichecker.FilterFactory.locationClass';
}
return new bidichecker.FilterFactory.LocationClassFilter_(
{'className': className});
};
/**
* Create a filter which suppresses errors based on a regular expression match
* of one of the class names of any parent node of the error location in the
* DOM.
* @param {string|RegExp} classRegexp A regular expression, which must match
* one of the class names in the {@code class} attribute of the location or
* one of its ancestors. Must not be empty or null.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.locationClassRegexp = function(classRegexp) {
if (!classRegexp || classRegexp == '') {
throw 'Empty or null argument to ' +
'bidichecker.FilterFactory.locationClassRegexp';
}
return new bidichecker.FilterFactory.LocationClassRegexpFilter_(
{'classRegexp': classRegexp});
};
/**
* Create a filter which suppresses errors based on a literal match of the error
* location's (or one of its DOM ancestors') {@code id} attribute.
* @param {string} id A string which must match the entire {@code id} attribute
* of the location or one of its ancestors. Must not be empty or null.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.locationId = function(id) {
if (!id || id == '') {
throw 'Empty or null argument to bidichecker.FilterFactory.locationId';
}
return new bidichecker.FilterFactory.LocationIdFilter_({'id': id});
};
/**
* Create a filter which suppresses errors by applying a regular expression to
* the error location's (or one of its DOM ancestors') {@code id} attribute.
* @param {string|RegExp} idRegexp A regular expression, which must match the
* entire {@code id} attribute of the location or one of its ancestors. Must
* not be empty or null.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.locationIdRegexp = function(idRegexp) {
if (!idRegexp || idRegexp == '') {
throw 'Empty or null argument to ' +
'bidichecker.FilterFactory.locationIdRegexp';
}
return new bidichecker.FilterFactory.LocationIdRegexpFilter_(
{'idRegexp': idRegexp});
};
/**
* Create a filter which suppresses errors by inverting another filter.
* @param {!bidichecker.Filter} filter The subfilter.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.not = function(filter) {
return new bidichecker.FilterFactory.NotFilter_({'filter': filter});
};
/**
* Create a filter which suppresses errors by or-ing component filters.
* @param {!bidichecker.Filter} filter1 The first subfilter.
* @param {!bidichecker.Filter} filter2 The second subfilter.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.or = function(filter1, filter2) {
return new bidichecker.FilterFactory.OrFilter_(
{'filter1': filter1, 'filter2': filter2});
};
/**
* Create a filter which suppresses errors based on a literal match of their
* {@code precededByText} fields.
* @param {?string} precededByText A string which must match the entire {@code
* precededByText} field. If empty or null, will only match an empty or null
* {@code precededByText}.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.precededByText = function(precededByText) {
return new bidichecker.FilterFactory.PrecededByTextFilter_(
{'precededByText': precededByText || ''});
};
/**
* Create a filter which suppresses errors by applying a regular expression to
* their {@code precededByText} fields.
* @param {string|RegExp} precededByTextRegexp A regular expression, which must
* match the entire {@code precededByText} field. If empty or null, will
* only match an empty or null {@code precededByText}.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.precededByTextRegexp = function(
precededByTextRegexp) {
return new bidichecker.FilterFactory.PrecededByTextRegexpFilter_(
{'precededByTextRegexp': precededByTextRegexp || ''});
};
/**
* Create a filter which suppresses errors based on their severity levels.
* @param {number} severityThreshold the severity level from which errors should
* be suppressed. At level 1, all messages will be filtered out. Note that
* higher values indicate lower severities.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.severityFrom = function(severityThreshold) {
return new bidichecker.FilterFactory.SeverityFilter_(
{'severityThreshold': severityThreshold});
};
/**
* Create a filter which suppresses errors based on their type fields.
* @param {string} type The error type name to be matched exactly.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter object.
* @export
*/
bidichecker.FilterFactory.type = function(type) {
return new bidichecker.FilterFactory.TypeFilter_({'type': type});
};
/**
* Checks that a required field exists in an object representing a filter, or
* else throws a string exception.
* @param {!Object} bareObject The object representing the filter.
* @param {string} field The name of the field.
* @private
*/
bidichecker.FilterFactory.checkParamExists_ = function(bareObject, field) {
if (!(field in bareObject)) {
throw 'No \'' + field + '\' parameter found for \'' +
bareObject['opcode'] + '\' filter';
}
};
/**
* Checks that a required field of a given type exists in an object representing
* a filter, or else throws a string exception.
* @param {!Object} bareObject The object representing the filter.
* @param {string} field The name of the field.
* @param {string} type The required type of the field.
* @private
*/
bidichecker.FilterFactory.checkParam_ = function(bareObject, field, type) {
bidichecker.FilterFactory.checkParamExists_(bareObject, field);
if (typeof bareObject[field] != type) {
throw 'Wrong type for \'' + field + '\' parameter of \'' +
bareObject['opcode'] + '\' filter; expected ' + type;
}
};
/**
* Reads a string-valued field from an object representing a filter.
* @param {!Object} bareObject The object representing the filter.
* @param {string} field The name of the field.
* @return {string} The field value.
* @private
*/
bidichecker.FilterFactory.getStringParam_ = function(bareObject, field) {
bidichecker.FilterFactory.checkParam_(bareObject, field, 'string');
return (/** @type {string} */ bareObject[field]);
};
/**
* Reads a number-valued field from an object representing a filter.
* @param {!Object} bareObject The object representing the filter.
* @param {string} field The name of the field.
* @return {number} The field value.
* @private
*/
bidichecker.FilterFactory.getNumberParam_ = function(bareObject, field) {
bidichecker.FilterFactory.checkParam_(bareObject, field, 'number');
return (/** @type {number} */ bareObject[field]);
};
/**
* Reads a regular expression field from an object representing a filter.
* The field contents must be a string or a RegExp object.
* @param {!Object} bareObject The object representing the filter.
* @param {string} fieldName The name of the field.
* @return {!RegExp} A regular expression anchored at both ends of the string.
* @private
*/
bidichecker.FilterFactory.getRegexpParam_ = function(bareObject, fieldName) {
bidichecker.FilterFactory.checkParamExists_(bareObject, fieldName);
var field = bareObject[fieldName];
var pattern;
if (typeof field == 'string') {
pattern = (/** @type {string} */ field);
} else if (field instanceof RegExp) {
pattern = field.source;
} else {
throw 'Wrong type for \'' + fieldName + '\' parameter of \'' +
bareObject['opcode'] + '\' filter; expected string or RegExp';
}
return new RegExp('^(' + pattern + ')$');
};
/**
* Reads a field representing a subfilter from an object representing a filter.
* The field contents can either be a bare object representing a serialized
* filter, or an object supporting an {@code isSuppressed()} method.
* @param {!Object} bareObject The object representing the filter.
* @param {string} field The name of the field.
* @return {!bidichecker.FilterFactory.ComposableFilter_} A filter constructed
* from the field's contents.
* @private
*/
bidichecker.FilterFactory.getFilterParam_ = function(
bareObject, field) {
bidichecker.FilterFactory.checkParam_(bareObject, field, 'object');
// Recursively build any subfilters referred to by this one.
var subfilterObject = bareObject[field];
if (subfilterObject instanceof bidichecker.FilterFactory.ComposableFilter_) {
// Found a constructed filter object.
return subfilterObject;
} else if (typeof subfilterObject['opcode'] == 'string') {
// Found a raw filter object.
return bidichecker.FilterFactory.constructFilter(subfilterObject);
} else {
throw 'Can\'t make a filter out of the \'' + field + '\' parameter of \'' +
bareObject['opcode'] + '\' filter';
}
};
/**
* A filter which suppresses errors by and-ing component filters.
* @param {!Object} bareObject An object containing 'filter1' and 'filter2'
* fields, each containing a bare object representing a component filter.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.AndFilter_ = function(bareObject) {
/**
* @type {!bidichecker.Filter}
* @private
*/
this.filter1_ =
bidichecker.FilterFactory.getFilterParam_(bareObject, 'filter1');
/**
* @type {!bidichecker.Filter}
* @private
*/
this.filter2_ =
bidichecker.FilterFactory.getFilterParam_(bareObject, 'filter2');
};
goog.inherits(bidichecker.FilterFactory.AndFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.AndFilter_.prototype.isSuppressed = function(
error, locationElements) {
return this.filter1_.isSuppressed(error, locationElements) &&
this.filter2_.isSuppressed(error, locationElements);
};
/**
* A filter which suppresses errors by a literal match of their {@code atText}
* fields.
* @param {!Object} bareObject An object containing an 'atText' field, which
* must match the entire {@code atText} field value. If empty, will only
* match an empty or null {@code atText}.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.AtTextFilter_ = function(bareObject) {
/**
* @type {string}
* @private
*/
this.atText_ =
bidichecker.FilterFactory.getStringParam_(bareObject, 'atText');
};
goog.inherits(bidichecker.FilterFactory.AtTextFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.AtTextFilter_.prototype.isSuppressed = function(
error, locationElements) {
return this.atText_ == (error.getAtText() || '');
};
/**
* A filter which suppresses errors by applying a regular expression to their
* {@code atText} fields.
* @param {!Object} bareObject An object containing an 'atTextRegexp' field
* containing a regular expression, which must match the entire {@code
* atText} field value. If empty, will only match an empty or null {@code
* atText}.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.AtTextRegexpFilter_ = function(bareObject) {
/**
* @type {!RegExp}
* @private
*/
this.atTextRegexp_ =
bidichecker.FilterFactory.getRegexpParam_(bareObject, 'atTextRegexp');
};
goog.inherits(bidichecker.FilterFactory.AtTextRegexpFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.AtTextRegexpFilter_.prototype.isSuppressed = function(
error, locationElements) {
return this.atTextRegexp_.test(error.getAtText() || '');
};
/**
* A filter which suppresses errors by a literal match of their {@code
* followedByText} fields.
* @param {!Object} bareObject An object containing a 'followedByText' field,
* which must match the entire {@code followedByText} field value. If empty,
* will only match an empty or null {@code followedByText}.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.FollowedByTextFilter_ = function(bareObject) {
/**
* @type {string}
* @private
*/
this.followedByText_ =
bidichecker.FilterFactory.getStringParam_(bareObject, 'followedByText');
};
goog.inherits(bidichecker.FilterFactory.FollowedByTextFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.FollowedByTextFilter_.prototype.isSuppressed =
function(error, locationElements) {
return this.followedByText_ == (error.getFollowedByText() || '');
};
/**
* A filter which suppresses errors by applying a regular expression to their
* {@code followedByText} fields.
* @param {!Object} bareObject An object containing a 'followedByTextRegexp'
* field containing a regular expression, which must match the entire {@code
* followedByText} field value. If empty, will only match an empty or null
* {@code followedByText}.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.FollowedByTextRegexpFilter_ = function(bareObject) {
/**
* @type {!RegExp}
* @private
*/
this.followedByTextRegexp_ =
bidichecker.FilterFactory.getRegexpParam_(bareObject,
'followedByTextRegexp');
};
goog.inherits(bidichecker.FilterFactory.FollowedByTextRegexpFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.FollowedByTextRegexpFilter_.prototype.isSuppressed =
function(error, locationElements) {
return this.followedByTextRegexp_.test(error.getFollowedByText() || '');
};
/**
* A filter which suppresses errors by a literal match of the error location's
* (or one of its DOM ancestors') {@code class} name.
* @param {!Object} bareObject An object containing a 'className' field, which
* must match one of the class names in the {@code class} attribute of the
* location or one of its ancestors.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.LocationClassFilter_ = function(bareObject) {
/**
* @type {string}
* @private
*/
this.className_ =
bidichecker.FilterFactory.getStringParam_(bareObject, 'className');
};
goog.inherits(bidichecker.FilterFactory.LocationClassFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.LocationClassFilter_.prototype.isSuppressed =
function(error, locationElements) {
for (var i = 0; i < locationElements.length; ++i) {
for (var current = locationElements[i]; current;
current = current.parentNode) {
if (current.className) {
// Match each whitespace-separated class name separately.
var classNames = current.className.split(/\s/);
for (var j = 0; j < classNames.length; ++j) {
if (this.className_ == classNames[j]) {
return true;
}
}
}
}
}
return false;
};
/**
* A filter which suppresses errors by applying a regular expression to the
* error location's (or one of its DOM ancestors') {@code class} name.
* @param {!Object} bareObject An object containing a 'classRegexp' field,
* containing a regular expression which must match one of the class names
* in the {@code class} attribute of the location or one of its ancestors.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.LocationClassRegexpFilter_ = function(bareObject) {
/**
* @type {!RegExp}
* @private
*/
this.classRegexp_ =
bidichecker.FilterFactory.getRegexpParam_(bareObject, 'classRegexp');
};
goog.inherits(bidichecker.FilterFactory.LocationClassRegexpFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.LocationClassRegexpFilter_.prototype.isSuppressed =
function(error, locationElements) {
for (var i = 0; i < locationElements.length; ++i) {
for (var current = locationElements[i]; current;
current = current.parentNode) {
if (current.className) {
// Match each whitespace-separated class name separately.
var classNames = current.className.split(/\s/);
for (var j = 0; j < classNames.length; ++j) {
if (this.classRegexp_.test(classNames[j])) {
return true;
}
}
}
}
}
return false;
};
/**
* A filter which suppresses errors by a literal match of the error location's
* (or one of its DOM ancestors') {@code id} attribute.
* @param {!Object} bareObject An object containing an 'id' field, which must
* match the {@code id} attribute of the location or one of its ancestors.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.LocationIdFilter_ = function(bareObject) {
/**
* @type {string}
* @private
*/
this.id_ = bidichecker.FilterFactory.getStringParam_(bareObject, 'id');
};
goog.inherits(bidichecker.FilterFactory.LocationIdFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.LocationIdFilter_.prototype.isSuppressed = function(
error, locationElements) {
for (var i = 0; i < locationElements.length; ++i) {
for (var current = locationElements[i]; current;
current = current.parentNode) {
if (current.id && this.id_ == current.id) {
return true;
}
}
}
return false;
};
/**
* A filter which suppresses errors by applying a regular expression to the
* error location's (or one of its DOM ancestors') {@code id} attribute.
* @param {!Object} bareObject An object containing an 'idRegexp' field
* containing a regular expression, which must match the {@code id}
* attribute of the location or one of its ancestors.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.LocationIdRegexpFilter_ = function(bareObject) {
/**
* @type {!RegExp}
* @private
*/
this.idRegexp_ =
bidichecker.FilterFactory.getRegexpParam_(bareObject, 'idRegexp');
};
goog.inherits(bidichecker.FilterFactory.LocationIdRegexpFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.LocationIdRegexpFilter_.prototype.isSuppressed =
function(error, locationElements) {
for (var i = 0; i < locationElements.length; ++i) {
for (var current = locationElements[i]; current;
current = current.parentNode) {
if (current.id && this.idRegexp_.test(current.id)) {
return true;
}
}
}
return false;
};
/**
* A filter which suppresses errors by inverting another filter.
* @param {!Object} bareObject An object containing a 'filter' field, containing
* a bare object representing a component filter.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.NotFilter_ = function(bareObject) {
/**
* @type {!bidichecker.Filter}
* @private
*/
this.filter_ =
bidichecker.FilterFactory.getFilterParam_(bareObject, 'filter');
};
goog.inherits(bidichecker.FilterFactory.NotFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.NotFilter_.prototype.isSuppressed = function(
error, locationElements) {
return !this.filter_.isSuppressed(error, locationElements);
};
/**
* A filter which suppresses errors by or-ing component filters.
* @param {!Object} bareObject An object containing 'filter1' and 'filter2'
* fields, each containing a bare object representing a component filter.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.OrFilter_ = function(bareObject) {
/**
* @type {!bidichecker.Filter}
* @private
*/
this.filter1_ =
bidichecker.FilterFactory.getFilterParam_(bareObject, 'filter1');
/**
* @type {!bidichecker.Filter}
* @private
*/
this.filter2_ =
bidichecker.FilterFactory.getFilterParam_(bareObject, 'filter2');
};
goog.inherits(bidichecker.FilterFactory.OrFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.OrFilter_.prototype.isSuppressed = function(
error, locationElements) {
return this.filter1_.isSuppressed(error, locationElements) ||
this.filter2_.isSuppressed(error, locationElements);
};
/**
* A filter which suppresses errors by a literal match of their {@code
* precededByText} fields.
* @param {!Object} bareObject An object containing a 'precededByText' field,
* which must match the entire {@code precededByText} field value. If empty,
* will only match an empty or null {@code precededByText}.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.PrecededByTextFilter_ = function(bareObject) {
/**
* @type {string}
* @private
*/
this.precededByText_ =
bidichecker.FilterFactory.getStringParam_(bareObject, 'precededByText');
};
goog.inherits(bidichecker.FilterFactory.PrecededByTextFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.PrecededByTextFilter_.prototype.isSuppressed =
function(error, locationElements) {
return this.precededByText_ == (error.getPrecededByText() || '');
};
/**
* A filter which suppresses errors by applying a regular expression to their
* {@code precededByText} fields.
* @param {!Object} bareObject An object containing a 'precededByTextRegexp'
* field containing a regular expression, which must match the entire
* precededByText field value. If empty, will only match an empty or null
* {@code precededByText}.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.PrecededByTextRegexpFilter_ = function(bareObject) {
/**
* @type {!RegExp}
* @private
*/
this.precededByTextRegexp_ =
bidichecker.FilterFactory.getRegexpParam_(bareObject,
'precededByTextRegexp');
};
goog.inherits(bidichecker.FilterFactory.PrecededByTextRegexpFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.PrecededByTextRegexpFilter_.prototype.isSuppressed =
function(error, locationElements) {
return this.precededByTextRegexp_.test(error.getPrecededByText() || '');
};
/**
* A filter which suppresses errors based on their severity fields.
* @param {!Object} bareObject An object containing an integer-valued
* 'severityThreshold' field representing the threshold severity value for
* suppression.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.SeverityFilter_ = function(bareObject) {
/**
* @type {number}
* @private
*/
this.severityThreshold_ = bidichecker.FilterFactory.getNumberParam_(
bareObject, 'severityThreshold');
};
goog.inherits(bidichecker.FilterFactory.SeverityFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.SeverityFilter_.prototype.isSuppressed = function(
error, locationElements) {
return this.severityThreshold_ <= error.getSeverity();
};
/**
* A filter which suppresses errors based on their type fields.
* @param {!Object} bareObject An object containing a string-valued 'type' field
* which must exactly match the error type value.
* @constructor
* @extends {bidichecker.FilterFactory.ComposableFilter_}
* @private
*/
bidichecker.FilterFactory.TypeFilter_ = function(bareObject) {
/**
* @type {string}
* @private
*/
this.type_ = bidichecker.FilterFactory.getStringParam_(bareObject, 'type');
};
goog.inherits(bidichecker.FilterFactory.TypeFilter_,
bidichecker.FilterFactory.ComposableFilter_);
/** @inheritDoc */
bidichecker.FilterFactory.TypeFilter_.prototype.isSuppressed = function(
error, locationElements) {
return this.type_ == error.getType();
};