mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 453529 - Retain embed visits and places into the temp table in memory, r=sdwilsh
This commit is contained in:
parent
c13d5fd1dd
commit
da6bfbbb37
@ -97,12 +97,6 @@ const PRTime EXPIRATION_POLICY_DAYS = ((PRTime)7 * 86400 * PR_USEC_PER_SEC);
|
|||||||
const PRTime EXPIRATION_POLICY_WEEKS = ((PRTime)30 * 86400 * PR_USEC_PER_SEC);
|
const PRTime EXPIRATION_POLICY_WEEKS = ((PRTime)30 * 86400 * PR_USEC_PER_SEC);
|
||||||
const PRTime EXPIRATION_POLICY_MONTHS = ((PRTime)180 * 86400 * PR_USEC_PER_SEC);
|
const PRTime EXPIRATION_POLICY_MONTHS = ((PRTime)180 * 86400 * PR_USEC_PER_SEC);
|
||||||
|
|
||||||
// Expiration policy for embedded links (bug #401722)
|
|
||||||
const PRTime EMBEDDED_LINK_LIFETIME = ((PRTime)1 * 86400 * PR_USEC_PER_SEC);
|
|
||||||
|
|
||||||
// Expiration cap for embedded visits
|
|
||||||
#define EXPIRATION_CAP_EMBEDDED 500
|
|
||||||
|
|
||||||
// Expiration cap for dangling moz_places records
|
// Expiration cap for dangling moz_places records
|
||||||
#define EXPIRATION_CAP_PLACES 500
|
#define EXPIRATION_CAP_PLACES 500
|
||||||
|
|
||||||
@ -201,13 +195,6 @@ nsNavHistoryExpire::OnQuit()
|
|||||||
if (NS_FAILED(rv))
|
if (NS_FAILED(rv))
|
||||||
NS_WARNING("ExpireForDegenerateRuns failed.");
|
NS_WARNING("ExpireForDegenerateRuns failed.");
|
||||||
|
|
||||||
// Expire embedded links
|
|
||||||
// NOTE: This must come before ExpireHistoryParanoid, or the moz_places
|
|
||||||
// records won't be immediately deleted.
|
|
||||||
rv = ExpireEmbeddedLinks(connection);
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
NS_WARNING("ExpireEmbeddedLinks failed.");
|
|
||||||
|
|
||||||
// Determine whether we can skip partially expiration of dangling entries
|
// Determine whether we can skip partially expiration of dangling entries
|
||||||
// because we be doing a full expiration on shutdown in ClearHistory()
|
// because we be doing a full expiration on shutdown in ClearHistory()
|
||||||
nsCOMPtr<nsIPrefBranch> prefs(do_GetService("@mozilla.org/preferences-service;1"));
|
nsCOMPtr<nsIPrefBranch> prefs(do_GetService("@mozilla.org/preferences-service;1"));
|
||||||
@ -896,48 +883,6 @@ nsNavHistoryExpire::ExpireAnnotations(mozIStorageConnection* aConnection)
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// nsNavHistoryExpire::ExpireEmbeddedLinks
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsNavHistoryExpire::ExpireEmbeddedLinks(mozIStorageConnection* aConnection)
|
|
||||||
{
|
|
||||||
PRTime maxEmbeddedAge = PR_Now() - EMBEDDED_LINK_LIFETIME;
|
|
||||||
nsCOMPtr<mozIStorageStatement> expireEmbeddedLinksStatement;
|
|
||||||
// Note: This query also removes visit_type = 0 entries, for bug #375777.
|
|
||||||
nsresult rv = aConnection->CreateStatement(NS_LITERAL_CSTRING(
|
|
||||||
"DELETE FROM moz_historyvisits_view WHERE id IN ("
|
|
||||||
"SELECT * FROM ( "
|
|
||||||
"SELECT id FROM moz_historyvisits_temp "
|
|
||||||
"WHERE visit_date < ?1 "
|
|
||||||
"AND visit_type IN (") +
|
|
||||||
nsPrintfCString("%d", nsINavHistoryService::TRANSITION_EMBED) +
|
|
||||||
NS_LITERAL_CSTRING(", 0) "
|
|
||||||
"LIMIT ?2 "
|
|
||||||
") "
|
|
||||||
"UNION ALL "
|
|
||||||
"SELECT * FROM ( "
|
|
||||||
"SELECT id FROM moz_historyvisits "
|
|
||||||
"WHERE visit_date < ?1 "
|
|
||||||
"AND visit_type IN (") +
|
|
||||||
nsPrintfCString("%d", nsINavHistoryService::TRANSITION_EMBED) +
|
|
||||||
NS_LITERAL_CSTRING(", 0) "
|
|
||||||
"LIMIT ?2 "
|
|
||||||
") "
|
|
||||||
"LIMIT ?2 "
|
|
||||||
")"),
|
|
||||||
getter_AddRefs(expireEmbeddedLinksStatement));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
rv = expireEmbeddedLinksStatement->BindInt64Parameter(0, maxEmbeddedAge);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
rv = expireEmbeddedLinksStatement->BindInt32Parameter(1, EXPIRATION_CAP_EMBEDDED);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
rv = expireEmbeddedLinksStatement->Execute();
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// nsNavHistoryExpire::ExpireHistoryParanoid
|
// nsNavHistoryExpire::ExpireHistoryParanoid
|
||||||
//
|
//
|
||||||
// Deletes any dangling history entries that aren't associated with any
|
// Deletes any dangling history entries that aren't associated with any
|
||||||
|
@ -84,7 +84,6 @@ protected:
|
|||||||
nsresult DoPartialExpiration();
|
nsresult DoPartialExpiration();
|
||||||
|
|
||||||
nsresult ExpireAnnotations(mozIStorageConnection* aConnection);
|
nsresult ExpireAnnotations(mozIStorageConnection* aConnection);
|
||||||
nsresult ExpireEmbeddedLinks(mozIStorageConnection* aConnection);
|
|
||||||
|
|
||||||
// parts of ExpireItems
|
// parts of ExpireItems
|
||||||
nsresult FindVisits(PRTime aExpireThreshold, PRUint32 aNumToExpire,
|
nsresult FindVisits(PRTime aExpireThreshold, PRUint32 aNumToExpire,
|
||||||
|
@ -257,7 +257,28 @@ nsPlacesDBFlush.prototype = {
|
|||||||
// Delete all the data in the temp table.
|
// Delete all the data in the temp table.
|
||||||
// We have triggers setup that ensure that the data is transferred over
|
// We have triggers setup that ensure that the data is transferred over
|
||||||
// upon deletion.
|
// upon deletion.
|
||||||
return this._db.createStatement("DELETE FROM moz_" + aTableName + "_temp");
|
let condition = "";
|
||||||
|
switch(aTableName) {
|
||||||
|
case "historyvisits":
|
||||||
|
// For history table we want to leave embed visits in memory, since
|
||||||
|
// those are expired with current session, so we are filtering them out.
|
||||||
|
condition = "WHERE visit_type <> " + Ci.nsINavHistoryService.TRANSITION_EMBED;
|
||||||
|
break;
|
||||||
|
case "places":
|
||||||
|
// For places table we want to leave places associated with embed visits
|
||||||
|
// in memory, they usually have hidden = 1 and at least an embed visit
|
||||||
|
// in historyvisits_temp table.
|
||||||
|
condition = "WHERE id IN (SELECT id FROM moz_places_temp h " +
|
||||||
|
"WHERE h.hidden <> 1 OR NOT EXISTS ( " +
|
||||||
|
"SELECT id FROM moz_historyvisits_temp " +
|
||||||
|
"WHERE place_id = h.id AND visit_type = " +
|
||||||
|
Ci.nsINavHistoryService.TRANSITION_EMBED +
|
||||||
|
" LIMIT 1) " +
|
||||||
|
")";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._db.createStatement("DELETE FROM moz_" + aTableName + "_temp " + condition);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,173 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
* vim: sw=2 ts=2 sts=2 expandtab
|
||||||
|
* ***** 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 mozilla.org code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Mozilla Corporation.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2008
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Marco Bonardo <mak77@bonardo.net> (Original Author)
|
||||||
|
*
|
||||||
|
* 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 ***** */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This test checks that embed visits are not synced down to disk, we hold
|
||||||
|
* them in memory since they're going to be purged at session close
|
||||||
|
*/
|
||||||
|
|
||||||
|
var hs = Cc["@mozilla.org/browser/nav-history-service;1"].
|
||||||
|
getService(Ci.nsINavHistoryService);
|
||||||
|
var dbConn = hs.QueryInterface(Ci.nsPIPlacesDatabase).DBConnection;
|
||||||
|
var bs = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
|
||||||
|
getService(Ci.nsINavBookmarksService);
|
||||||
|
var prefs = Cc["@mozilla.org/preferences-service;1"].
|
||||||
|
getService(Ci.nsIPrefService).
|
||||||
|
getBranch("places.");
|
||||||
|
var os = Cc["@mozilla.org/observer-service;1"].
|
||||||
|
getService(Ci.nsIObserverService);
|
||||||
|
|
||||||
|
const TEST_URI = "http://test.com/";
|
||||||
|
const EMBED_URI = "http://embed.test.com/";
|
||||||
|
const PLACE_URI = "place:test.com/";
|
||||||
|
|
||||||
|
const kSyncPrefName = "syncDBTableIntervalInSecs";
|
||||||
|
const SYNC_INTERVAL = 1;
|
||||||
|
const kSyncFinished = "places-sync-finished";
|
||||||
|
|
||||||
|
var transitions = [ hs.TRANSITION_LINK,
|
||||||
|
hs.TRANSITION_TYPED,
|
||||||
|
hs.TRANSITION_BOOKMARK,
|
||||||
|
hs.TRANSITION_EMBED,
|
||||||
|
hs.TRANSITION_REDIRECT_PERMANENT,
|
||||||
|
hs.TRANSITION_REDIRECT_TEMPORARY,
|
||||||
|
hs.TRANSITION_DOWNLOAD ];
|
||||||
|
|
||||||
|
var observer = {
|
||||||
|
observe: function(aSubject, aTopic, aData) {
|
||||||
|
if (aTopic == kSyncFinished && this.visitId != -1) {
|
||||||
|
// remove the observer, we don't need to observe sync on quit
|
||||||
|
os.removeObserver(this, kSyncFinished);
|
||||||
|
dump("\n\n");
|
||||||
|
dump_table("moz_places_temp");
|
||||||
|
dump_table("moz_places");
|
||||||
|
dump("\n\n");
|
||||||
|
// Check that moz_places table has been correctly synced
|
||||||
|
var stmt = dbConn.createStatement(
|
||||||
|
"SELECT id FROM moz_places WHERE url = :url");
|
||||||
|
stmt.params["url"] = TEST_URI;
|
||||||
|
do_check_true(stmt.executeStep());
|
||||||
|
stmt.finalize();
|
||||||
|
stmt = dbConn.createStatement(
|
||||||
|
"SELECT id FROM moz_places_temp WHERE url = :url");
|
||||||
|
stmt.params["url"] = TEST_URI;
|
||||||
|
do_check_false(stmt.executeStep());
|
||||||
|
stmt.finalize();
|
||||||
|
|
||||||
|
stmt = dbConn.createStatement(
|
||||||
|
"SELECT id FROM moz_places WHERE url = :url");
|
||||||
|
stmt.params["url"] = EMBED_URI;
|
||||||
|
do_check_false(stmt.executeStep());
|
||||||
|
stmt.finalize();
|
||||||
|
stmt = dbConn.createStatement(
|
||||||
|
"SELECT id FROM moz_places_temp WHERE url = :url");
|
||||||
|
stmt.params["url"] = EMBED_URI;
|
||||||
|
do_check_true(stmt.executeStep());
|
||||||
|
stmt.finalize();
|
||||||
|
|
||||||
|
stmt = dbConn.createStatement(
|
||||||
|
"SELECT id FROM moz_places WHERE url = :url");
|
||||||
|
stmt.params["url"] = PLACE_URI;
|
||||||
|
do_check_true(stmt.executeStep());
|
||||||
|
stmt.finalize();
|
||||||
|
stmt = dbConn.createStatement(
|
||||||
|
"SELECT id FROM moz_places_temp WHERE url = :url");
|
||||||
|
stmt.params["url"] = PLACE_URI;
|
||||||
|
do_check_false(stmt.executeStep());
|
||||||
|
stmt.finalize();
|
||||||
|
|
||||||
|
// Check that all visits but embed ones are in disk table
|
||||||
|
stmt = dbConn.createStatement(
|
||||||
|
"SELECT count(*) FROM moz_historyvisits h WHERE visit_type <> :t_embed");
|
||||||
|
stmt.params["t_embed"] = hs.TRANSITION_EMBED;
|
||||||
|
do_check_true(stmt.executeStep());
|
||||||
|
do_check_eq(stmt.getInt32(0), (transitions.length - 1) * 2);
|
||||||
|
stmt.finalize();
|
||||||
|
stmt = dbConn.createStatement(
|
||||||
|
"SELECT id FROM moz_historyvisits h WHERE visit_type = :t_embed");
|
||||||
|
stmt.params["t_embed"] = hs.TRANSITION_EMBED;
|
||||||
|
do_check_false(stmt.executeStep());
|
||||||
|
stmt.finalize();
|
||||||
|
stmt = dbConn.createStatement(
|
||||||
|
"SELECT id FROM moz_historyvisits_temp h WHERE visit_type = :t_embed");
|
||||||
|
stmt.params["t_embed"] = hs.TRANSITION_EMBED;
|
||||||
|
do_check_true(stmt.executeStep());
|
||||||
|
stmt.finalize();
|
||||||
|
stmt = dbConn.createStatement(
|
||||||
|
"SELECT id FROM moz_historyvisits_temp h WHERE visit_type <> :t_embed");
|
||||||
|
stmt.params["t_embed"] = hs.TRANSITION_EMBED;
|
||||||
|
do_check_false(stmt.executeStep());
|
||||||
|
stmt.finalize();
|
||||||
|
|
||||||
|
do_test_finished();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function run_test()
|
||||||
|
{
|
||||||
|
// First set the preference for the timer to a small value
|
||||||
|
prefs.setIntPref(kSyncPrefName, SYNC_INTERVAL);
|
||||||
|
|
||||||
|
// Add a visit for every transition type on TEST_URI
|
||||||
|
// Embed visit should stay in temp table, while other should be synced
|
||||||
|
// Place entry for this uri should be synced to disk table
|
||||||
|
transitions.forEach(function addVisit(aTransition) {
|
||||||
|
hs.addVisit(uri(TEST_URI), Date.now() * 1000, null,
|
||||||
|
aTransition, false, 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add an embed visit for EMBED_URI
|
||||||
|
// Embed visit should stay in temp table
|
||||||
|
// Place entry for this uri should stay in temp table
|
||||||
|
hs.addVisit(uri(EMBED_URI), Date.now() * 1000, null,
|
||||||
|
hs.TRANSITION_EMBED, false, 0);
|
||||||
|
|
||||||
|
// Add a visit for every transition type on PLACE_URI
|
||||||
|
// Embed visit should stay in temp table
|
||||||
|
// Place entry for this uri should be synced to disk table
|
||||||
|
transitions.forEach(function addVisit(aTransition) {
|
||||||
|
hs.addVisit(uri(PLACE_URI), Date.now() * 1000, null,
|
||||||
|
aTransition, false, 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
os.addObserver(observer, kSyncFinished, false);
|
||||||
|
|
||||||
|
do_test_pending();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user