Bug 537189 - Ensure no data is left behind after removing prefs via 'removePrefsByName' and 'removeGroupedPrefs', r=myk

This commit is contained in:
Geoff Lankow 2010-01-05 18:38:06 -05:00
Родитель 12e7452996
Коммит 17c980d7ee
2 изменённых файлов: 99 добавлений и 8 удалений

Просмотреть файл

@ -253,6 +253,10 @@ ContentPrefService.prototype = {
try {
this._dbConnection.executeSimpleSQL("DELETE FROM prefs WHERE groupID IS NOT NULL");
this._dbConnection.executeSimpleSQL("DELETE FROM groups");
this._dbConnection.executeSimpleSQL(
"DELETE FROM settings " +
"WHERE id NOT IN (SELECT DISTINCT settingID FROM prefs)"
);
this._dbConnection.commitTransaction();
}
catch(ex) {
@ -271,18 +275,20 @@ ContentPrefService.prototype = {
return;
var selectGroupsStmt = this._dbCreateStatement(
"SELECT groups.name AS groupName " +
"SELECT groups.id AS groupID, groups.name AS groupName " +
"FROM prefs " +
"JOIN groups ON prefs.groupID = groups.id " +
"WHERE prefs.settingID = :setting "
);
var groupNames = [];
var groupIDs = [];
try {
selectGroupsStmt.params.setting = settingID;
var groups = [];
while (selectGroupsStmt.executeStep()) {
groups.push(selectGroupsStmt.row["groupName"]);
groupIDs.push(selectGroupsStmt.row["groupID"]);
groupNames.push(selectGroupsStmt.row["groupName"]);
}
}
finally {
@ -290,16 +296,16 @@ ContentPrefService.prototype = {
}
if (this.hasPref(null, aName)) {
groups.push(null);
groupNames.push(null);
}
this._dbConnection.executeSimpleSQL("DELETE FROM prefs WHERE settingID = " + settingID);
this._dbConnection.executeSimpleSQL("DELETE FROM settings WHERE id = " + settingID);
for (var i = 0; i < groups.length; i++) {
this._notifyPrefRemoved(groups[i], aName);
if (groups[i])
this._deleteGroupIfUnused(groups[i]);
for (var i = 0; i < groupNames.length; i++) {
this._notifyPrefRemoved(groupNames[i], aName);
if (groupNames[i]) // ie. not null, which will be last (and i == groupIDs.length)
this._deleteGroupIfUnused(groupIDs[i]);
}
},

Просмотреть файл

@ -0,0 +1,85 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (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.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Content Preferences (cpref).
*
* The Initial Developer of the Original Code is Mozilla.
* Portions created by the Initial Developer are Copyright (C) 2007
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Geoff Lankow <geoff@darktrojan.net>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
var cps = Cc["@mozilla.org/content-pref/service;1"].
getService(Ci.nsIContentPrefService);
function run_test() {
var uri1 = ContentPrefTest.getURI("http://www.domain1.com/");
var uri2 = ContentPrefTest.getURI("http://foo.domain1.com/");
var uri3 = ContentPrefTest.getURI("http://domain1.com/");
var uri4 = ContentPrefTest.getURI("http://www.domain2.com/");
cps.setPref(uri1, "one", 1);
cps.setPref(uri1, "two", 2);
cps.setPref(uri2, "one", 4);
cps.setPref(uri3, "three", 8);
cps.setPref(uri4, "two", 16);
cps.removePref(uri3, "three"); // uri3 should be removed now
checkForUnusedGroups();
checkForUnusedSettings();
cps.removePrefsByName("two"); // uri4 should be removed now
checkForUnusedGroups();
checkForUnusedSettings();
cps.removeGroupedPrefs();
checkForUnusedGroups();
checkForUnusedSettings();
}
function checkForUnusedGroups() {
var stmt = cps.DBConnection.createStatement(
"SELECT COUNT(*) AS count FROM groups " +
"WHERE id NOT IN (SELECT DISTINCT groupID FROM prefs)"
);
stmt.executeStep();
do_check_eq(0, stmt.row.count);
stmt.reset();
stmt.finalize();
}
function checkForUnusedSettings() {
var stmt = cps.DBConnection.createStatement(
"SELECT COUNT(*) AS count FROM settings " +
"WHERE id NOT IN (SELECT DISTINCT settingID FROM prefs)"
);
stmt.executeStep();
do_check_eq(0, stmt.row.count);
stmt.reset();
stmt.finalize();
}