我所做的:
- 确保 Firebug 正常工作。
- 在 isWrappedInParens() 函数中放置一个断点。
- 导航到我的网络应用程序。
- 触发对 isWrappedInParens() 的调用。
- 逐步执行 isWrappedInParens()。一切都很好,但它并没有超过指示为“CRASH POINT”的代码行。
- 我也尝试过没有运行 Firebug 或有断点,但它仍然冻结。
我注意到:
- 在大多数情况下, isWrappedInParens() 工作正常。
- 当它不起作用时,Firefox 会冻结。不过,我仍然可以最小化/展开/关闭窗口。
- 我还注意到,当测试字符串稍短(括号更少)时,firefox 会挂起,但最终会正确完成(约 30 秒)。
导致 Firefox 崩溃的示例字符串
// Note that this is not wrapped in parentheses,
// since it is two separate sets of nested parentheses
var test = "(the OR (and) OR (and) OR (and)) AND ((to) OR (to) OR (to))";
背景
- 浏览器:火狐3.6.18
- webapp 是一个码头应用程序。
代码
isWrappedInParens = function(str){
if(_.isNull(str)) {
return false;
}
str = str.trim();
var pattern = /^[(](([(][^()]+[)]|[^()]+)|[(]([(][^()]+[)]|[^()]+)+[)])+[)]$/;
var matchesPattern;
try{
matchesPattern = str.match(pattern) || null; //CRASH POINT!!!!!!!!!!!
}catch(err){
return false; //Note that no error is ever caught from freezing
}
var isWrapped = !_.isUndefined(matchesPattern) && !_.isNull(matchesPattern);
return isWrapped;
}
正则表达式的来源:
// Atoms, building blocks for the expressions
var parenAtom = "[(][^()]+[)]";
var nonParenAtom = "[^()]+";
// Expressions, building blocks for the final regular expression
var baseCase = "(" + parenAtom + "|" + nonParenAtom + ")";
var nestedCase = "[(]_base_[)]"
.replace("_base_", baseCase);
// Regular Expression
var wholeCase = "^[(](_base_|_nested_)+[)]$"
.replace("_base_", baseCase)
.replace("_nested_", nestedCase);
var pattern = new RegExp(wholeCase, "");