Bug 1156720 - Firefox freezes when parsing large data in Storage Inspector. r=mratcliffe

MozReview-Commit-ID: CopXwMnhzxY
This commit is contained in:
Jarda Snajdr 2016-04-21 08:52:00 +02:00
parent f9f09db5af
commit e3e7f277be
3 changed files with 31 additions and 3 deletions

View File

@ -14,6 +14,8 @@
"use strict";
const LONG_WORD = "a".repeat(1000);
const testCases = [
["cs2", [
{name: "cs2", value: "sessionCookie"},
@ -93,6 +95,23 @@ const testCases = [
{name: "ss3.an", value: "object"},
{name: "ss3.foo", value: "bar"},
], true],
["ss4", [
{name: "ss4", value: "Array"},
{name: "ss4.0", value: ""},
{name: "ss4.1", value: "array"},
{name: "ss4.2", value: ""},
{name: "ss4.3", value: "with"},
{name: "ss4.4", value: "empty"},
{name: "ss4.5", value: "items"},
], true],
["ss5", [
{name: "ss5", value: "Array"},
{name: "ss5.0", value: LONG_WORD},
{name: "ss5.1", value: LONG_WORD},
{name: "ss5.2", value: LONG_WORD},
{name: "ss5.3", value: `${LONG_WORD}&${LONG_WORD}`},
{name: "ss5.4", value: `${LONG_WORD}&${LONG_WORD}`},
], true],
[["indexedDB", "http://test1.example.org", "idb1", "obj1"]],
[1, [
{name: 1, value: JSON.stringify({id: 1, name: "foo", email: "foo@bar.com"})}

View File

@ -32,6 +32,11 @@ localStorage.setItem("ls3", "http://foobar.com/baz.php");
sessionStorage.setItem("ss1", "This#is#an#array");
sessionStorage.setItem("ss2", "This~is~another~array");
sessionStorage.setItem("ss3", "this#is~an#object~foo#bar");
sessionStorage.setItem("ss4", "#array##with#empty#items");
// long string that is almost an object and might trigger exponential
// regexp backtracking
let s = "a".repeat(1000);
sessionStorage.setItem("ss5", `${s}=${s}=${s}=${s}&${s}=${s}&${s}`);
console.log("added cookies and stuff from main page");
let idbGenerator = function*() {

View File

@ -607,8 +607,10 @@ StorageUI.prototype = {
continue;
}
let p = separators[j];
let regex = new RegExp("^([^" + kv + p + "]*" + kv + "+[^" + kv + p +
"]*" + p + "*)+$", "g");
let word = `[^${kv}${p}]*`;
let keyValue = `${word}${kv}${word}`;
let keyValueList = `${keyValue}(${p}${keyValue})*`;
let regex = new RegExp(`^${keyValueList}$`);
if (value.match && value.match(regex) && value.includes(kv) &&
(value.includes(p) || value.split(kv).length == 2)) {
return makeObject(kv, p);
@ -617,7 +619,9 @@ StorageUI.prototype = {
}
// Testing for array
for (let p of separators) {
let regex = new RegExp("^[^" + p + "]+(" + p + "+[^" + p + "]*)+$", "g");
let word = `[^${p}]*`;
let wordList = `(${word}${p})+${word}`;
let regex = new RegExp(`^${wordList}$`);
if (value.match && value.match(regex)) {
return value.split(p.replace(/\\*/g, ""));
}