gecko/toolkit/components/places/tests/unit/test_history.js
Marco Bonardo ext:(%2C%20Shawn%20Wilsher%20%3Csdwilsh%40shawnwilsher.com%3E) 3fc608c2a6 Bug 449640 - Modify the places backend to use the temporary tables &
Bug 450705 - Optimize the query changes from the temp table rewrite
This changeset merges patches from two bugs to actually use the temporary tables
created for places.
Bug 449640 patch by Shawn Wilsher <sdwilsh@shawnwilsher.com>
r=dietrich, r=Mak77
Bug 450705 patch by Marco Bonardo <mak77@bonardo.net>
r=sdwilsh, r=dietrich, r=Mardak
2008-10-27 18:52:20 -04:00

236 lines
8.6 KiB
JavaScript

/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et: */
/* ***** 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 Google Inc.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Darin Fisher <darin@meer.net>
* Dietrich Ayala <dietrich@mozilla.com>
* Dan Mills <thunder@mozilla.com>
*
* 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 ***** */
// Get history service
try {
var histsvc = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService);
var gh = Cc["@mozilla.org/browser/global-history;2"].
getService(Ci.nsIGlobalHistory2);
} catch(ex) {
do_throw("Could not get history service\n");
}
/**
* Adds a test URI visit to the database, and checks for a valid place ID.
*
* @param aURI
* The URI to add a visit for.
* @param aReferrer
* The referring URI for the given URI. This can be null.
* @returns the place id for aURI.
*/
function add_visit(aURI, aReferrer) {
var placeID = histsvc.addVisit(aURI,
Date.now() * 1000,
aReferrer,
histsvc.TRANSITION_TYPED, // user typed in URL bar
false, // not redirect
0);
dump("### Added visit with id of " + placeID + "\n");
do_check_true(placeID > 0);
do_check_true(gh.isVisited(aURI));
return placeID;
}
/**
* Checks to see that a URI is in the database.
*
* @param aURI
* The URI to check.
* @returns true if the URI is in the DB, false otherwise.
*/
function uri_in_db(aURI) {
var options = histsvc.getNewQueryOptions();
options.maxResults = 1;
options.resultType = options.RESULTS_AS_URI
var query = histsvc.getNewQuery();
query.uri = aURI;
var result = histsvc.executeQuery(query, options);
var root = result.root;
root.containerOpen = true;
return (root.childCount == 1);
}
// main
function run_test() {
// add a visit
var testURI = uri("http://mozilla.com");
add_visit(testURI);
// now query for the visit, setting sorting and limit such that
// we should retrieve only the visit we just added
var options = histsvc.getNewQueryOptions();
options.sortingMode = options.SORT_BY_DATE_DESCENDING;
options.maxResults = 1;
// TODO: using full visit crashes in xpcshell test
//options.resultType = options.RESULTS_AS_FULL_VISIT;
options.resultType = options.RESULTS_AS_VISIT;
var query = histsvc.getNewQuery();
var result = histsvc.executeQuery(query, options);
var root = result.root;
root.containerOpen = true;
var cc = root.childCount;
for (var i=0; i < cc; ++i) {
var node = root.getChild(i);
// test node properties in RESULTS_AS_VISIT
do_check_eq(node.uri, testURI.spec);
do_check_eq(node.type, options.RESULTS_AS_VISIT);
// TODO: change query type to RESULTS_AS_FULL_VISIT and test this
//do_check_eq(node.transitionType, histsvc.TRANSITION_TYPED);
}
root.containerOpen = false;
// add another visit for the same URI, and a third visit for a different URI
var testURI2 = uri("http://google.com/");
add_visit(testURI);
add_visit(testURI2);
options.maxResults = 5;
options.resultType = options.RESULTS_AS_URI;
// test minVisits
query.minVisits = 0;
result = histsvc.executeQuery(query, options);
result.root.containerOpen = true;
do_check_eq(result.root.childCount, 2);
query.minVisits = 1;
result = histsvc.executeQuery(query, options);
result.root.containerOpen = true;
do_check_eq(result.root.childCount, 2);
query.minVisits = 2;
result = histsvc.executeQuery(query, options);
result.root.containerOpen = true;
do_check_eq(result.root.childCount, 1);
query.minVisits = 3;
result = histsvc.executeQuery(query, options);
result.root.containerOpen = true;
do_check_eq(result.root.childCount, 0);
// test maxVisits
query.minVisits = -1;
query.maxVisits = -1;
result = histsvc.executeQuery(query, options);
result.root.containerOpen = true;
do_check_eq(result.root.childCount, 2);
query.maxVisits = 0;
result = histsvc.executeQuery(query, options);
result.root.containerOpen = true;
do_check_eq(result.root.childCount, 0);
query.maxVisits = 1;
result = histsvc.executeQuery(query, options);
result.root.containerOpen = true;
do_check_eq(result.root.childCount, 1);
query.maxVisits = 2;
result = histsvc.executeQuery(query, options);
result.root.containerOpen = true;
do_check_eq(result.root.childCount, 2);
query.maxVisits = 3;
result = histsvc.executeQuery(query, options);
result.root.containerOpen = true;
do_check_eq(result.root.childCount, 2);
// test annotation-based queries
var annos = Cc["@mozilla.org/browser/annotation-service;1"].
getService(Ci.nsIAnnotationService);
annos.setPageAnnotation(uri("http://mozilla.com/"), "testAnno", 0, 0,
Ci.nsIAnnotationService.EXPIRE_NEVER);
query.annotation = "testAnno";
result = histsvc.executeQuery(query, options);
result.root.containerOpen = true;
do_check_eq(result.root.childCount, 1);
do_check_eq(result.root.getChild(0).uri, "http://mozilla.com/");
// test annotationIsNot
query.annotationIsNot = true;
result = histsvc.executeQuery(query, options);
result.root.containerOpen = true;
do_check_eq(result.root.childCount, 1);
do_check_eq(result.root.getChild(0).uri, "http://google.com/");
// by default, browser.history_expire_days is 9
do_check_true(!histsvc.historyDisabled);
// test getPageTitle
var title = histsvc.getPageTitle(uri("http://mozilla.com"));
do_check_eq(title, "mozilla.com");
// query for the visit
do_check_true(uri_in_db(testURI));
// test for schema changes in bug 373239
// get direct db connection
var db = histsvc.QueryInterface(Ci.nsPIPlacesDatabase).DBConnection;
var q = "SELECT id FROM moz_bookmarks";
try {
var statement = db.createStatement(q);
} catch(ex) {
do_throw("bookmarks table does not have id field, schema is too old!");
}
// bug 394741 - regressed history text searches
add_visit(uri("http://mozilla.com"));
var options = histsvc.getNewQueryOptions();
//options.resultType = options.RESULTS_AS_VISIT;
var query = histsvc.getNewQuery();
query.searchTerms = "moz";
var result = histsvc.executeQuery(query, options);
var root = result.root;
root.containerOpen = true;
do_check_true(root.childCount > 0);
// bug 400544 - testing that a referrer that is not in the DB gets added
var referrerURI = uri("http://yahoo.com");
do_check_false(uri_in_db(referrerURI));
add_visit(uri("http://mozilla.com"), referrerURI);
do_check_true(uri_in_db(referrerURI));
// test to ensure history.dat gets deleted if all history is being cleared
var file = do_get_file("toolkit/components/places/tests/unit/history.dat");
var histFile = dirSvc.get("ProfD", Ci.nsIFile);
file.copyTo(histFile, "history.dat");
histFile.append("history.dat");
do_check_true(histFile.exists());
var globalHistory = Components.classes["@mozilla.org/browser/global-history;2"]
.getService(Components.interfaces.nsIBrowserHistory);
globalHistory.removeAllPages();
do_check_false(histFile.exists());
}