summaryrefslogtreecommitdiffstats
path: root/toolkit/components/places/tests/queries/test_redirects.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/places/tests/queries/test_redirects.js')
-rw-r--r--toolkit/components/places/tests/queries/test_redirects.js311
1 files changed, 0 insertions, 311 deletions
diff --git a/toolkit/components/places/tests/queries/test_redirects.js b/toolkit/components/places/tests/queries/test_redirects.js
deleted file mode 100644
index 1be5a626f..000000000
--- a/toolkit/components/places/tests/queries/test_redirects.js
+++ /dev/null
@@ -1,311 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-// Array of visits we will add to the database, will be populated later
-// in the test.
-var visits = [];
-
-/**
- * Takes a sequence of query options, and compare query results obtained through
- * them with a custom filtered array of visits, based on the values we are
- * expecting from the query.
- *
- * @param aSequence
- * an array that contains query options in the form:
- * [includeHidden, maxResults, sortingMode]
- */
-function check_results_callback(aSequence) {
- // Sanity check: we should receive 3 parameters.
- do_check_eq(aSequence.length, 3);
- let includeHidden = aSequence[0];
- let maxResults = aSequence[1];
- let sortingMode = aSequence[2];
- print("\nTESTING: includeHidden(" + includeHidden + ")," +
- " maxResults(" + maxResults + ")," +
- " sortingMode(" + sortingMode + ").");
-
- function isHidden(aVisit) {
- return aVisit.transType == Ci.nsINavHistoryService.TRANSITION_FRAMED_LINK ||
- aVisit.isRedirect;
- }
-
- // Build expectedData array.
- let expectedData = visits.filter(function (aVisit, aIndex, aArray) {
- // Embed visits never appear in results.
- if (aVisit.transType == Ci.nsINavHistoryService.TRANSITION_EMBED)
- return false;
-
- if (!includeHidden && isHidden(aVisit)) {
- // If the page has any non-hidden visit, then it's visible.
- if (visits.filter(function (refVisit) {
- return refVisit.uri == aVisit.uri && !isHidden(refVisit);
- }).length == 0)
- return false;
- }
-
- return true;
- });
-
- // Remove duplicates, since queries are RESULTS_AS_URI (unique pages).
- let seen = [];
- expectedData = expectedData.filter(function (aData) {
- if (seen.includes(aData.uri)) {
- return false;
- }
- seen.push(aData.uri);
- return true;
- });
-
- // Sort expectedData.
- function getFirstIndexFor(aEntry) {
- for (let i = 0; i < visits.length; i++) {
- if (visits[i].uri == aEntry.uri)
- return i;
- }
- return undefined;
- }
- function comparator(a, b) {
- if (sortingMode == Ci.nsINavHistoryQueryOptions.SORT_BY_DATE_DESCENDING) {
- return b.lastVisit - a.lastVisit;
- }
- if (sortingMode == Ci.nsINavHistoryQueryOptions.SORT_BY_VISITCOUNT_DESCENDING) {
- return b.visitCount - a.visitCount;
- }
- return getFirstIndexFor(a) - getFirstIndexFor(b);
- }
- expectedData.sort(comparator);
-
- // Crop results to maxResults if it's defined.
- if (maxResults) {
- expectedData = expectedData.slice(0, maxResults);
- }
-
- // Create a new query with required options.
- let query = PlacesUtils.history.getNewQuery();
- let options = PlacesUtils.history.getNewQueryOptions();
- options.includeHidden = includeHidden;
- options.sortingMode = sortingMode;
- if (maxResults)
- options.maxResults = maxResults;
-
- // Compare resultset with expectedData.
- let result = PlacesUtils.history.executeQuery(query, options);
- let root = result.root;
- root.containerOpen = true;
- compareArrayToResult(expectedData, root);
- root.containerOpen = false;
-}
-
-/**
- * Enumerates all the sequences of the cartesian product of the arrays contained
- * in aSequences. Examples:
- *
- * cartProd([[1, 2, 3], ["a", "b"]], callback);
- * // callback is called 3 * 2 = 6 times with the following arrays:
- * // [1, "a"], [1, "b"], [2, "a"], [2, "b"], [3, "a"], [3, "b"]
- *
- * cartProd([["a"], [1, 2, 3], ["X", "Y"]], callback);
- * // callback is called 1 * 3 * 2 = 6 times with the following arrays:
- * // ["a", 1, "X"], ["a", 1, "Y"], ["a", 2, "X"], ["a", 2, "Y"],
- * // ["a", 3, "X"], ["a", 3, "Y"]
- *
- * cartProd([[1], [2], [3], [4]], callback);
- * // callback is called 1 * 1 * 1 * 1 = 1 time with the following array:
- * // [1, 2, 3, 4]
- *
- * cartProd([], callback);
- * // callback is 0 times
- *
- * cartProd([[1, 2, 3, 4]], callback);
- * // callback is called 4 times with the following arrays:
- * // [1], [2], [3], [4]
- *
- * @param aSequences
- * an array that contains an arbitrary number of arrays
- * @param aCallback
- * a function that is passed each sequence of the product as it's
- * computed
- * @return the total number of sequences in the product
- */
-function cartProd(aSequences, aCallback)
-{
- if (aSequences.length === 0)
- return 0;
-
- // For each sequence in aSequences, we maintain a pointer (an array index,
- // really) to the element we're currently enumerating in that sequence
- let seqEltPtrs = aSequences.map(i => 0);
-
- let numProds = 0;
- let done = false;
- while (!done) {
- numProds++;
-
- // prod = sequence in product we're currently enumerating
- let prod = [];
- for (let i = 0; i < aSequences.length; i++) {
- prod.push(aSequences[i][seqEltPtrs[i]]);
- }
- aCallback(prod);
-
- // The next sequence in the product differs from the current one by just a
- // single element. Determine which element that is. We advance the
- // "rightmost" element pointer to the "right" by one. If we move past the
- // end of that pointer's sequence, reset the pointer to the first element
- // in its sequence and then try the sequence to the "left", and so on.
-
- // seqPtr = index of rightmost input sequence whose element pointer is not
- // past the end of the sequence
- let seqPtr = aSequences.length - 1;
- while (!done) {
- // Advance the rightmost element pointer.
- seqEltPtrs[seqPtr]++;
-
- // The rightmost element pointer is past the end of its sequence.
- if (seqEltPtrs[seqPtr] >= aSequences[seqPtr].length) {
- seqEltPtrs[seqPtr] = 0;
- seqPtr--;
-
- // All element pointers are past the ends of their sequences.
- if (seqPtr < 0)
- done = true;
- }
- else break;
- }
- }
- return numProds;
-}
-
-function run_test()
-{
- run_next_test();
-}
-
-/**
- * Populate the visits array and add visits to the database.
- * We will generate visit-chains like:
- * visit -> redirect_temp -> redirect_perm
- */
-add_task(function* test_add_visits_to_database()
-{
- yield PlacesUtils.bookmarks.eraseEverything();
-
- // We don't really bother on this, but we need a time to add visits.
- let timeInMicroseconds = Date.now() * 1000;
- let visitCount = 1;
-
- // Array of all possible transition types we could be redirected from.
- let t = [
- Ci.nsINavHistoryService.TRANSITION_LINK,
- Ci.nsINavHistoryService.TRANSITION_TYPED,
- Ci.nsINavHistoryService.TRANSITION_BOOKMARK,
- // Embed visits are not added to the database and we don't want redirects
- // to them, thus just avoid addition.
- // Ci.nsINavHistoryService.TRANSITION_EMBED,
- Ci.nsINavHistoryService.TRANSITION_FRAMED_LINK,
- // Would make hard sorting by visit date because last_visit_date is actually
- // calculated excluding download transitions, but the query includes
- // downloads.
- // TODO: Bug 488966 could fix this behavior.
- //Ci.nsINavHistoryService.TRANSITION_DOWNLOAD,
- ];
-
- function newTimeInMicroseconds() {
- timeInMicroseconds = timeInMicroseconds - 1000;
- return timeInMicroseconds;
- }
-
- // we add a visit for each of the above transition types.
- t.forEach(transition => visits.push(
- { isVisit: true,
- transType: transition,
- uri: "http://" + transition + ".example.com/",
- title: transition + "-example",
- isRedirect: true,
- lastVisit: newTimeInMicroseconds(),
- visitCount: (transition == Ci.nsINavHistoryService.TRANSITION_EMBED ||
- transition == Ci.nsINavHistoryService.TRANSITION_FRAMED_LINK) ? 0 : visitCount++,
- isInQuery: true }));
-
- // Add a REDIRECT_TEMPORARY layer of visits for each of the above visits.
- t.forEach(transition => visits.push(
- { isVisit: true,
- transType: Ci.nsINavHistoryService.TRANSITION_REDIRECT_TEMPORARY,
- uri: "http://" + transition + ".redirect.temp.example.com/",
- title: transition + "-redirect-temp-example",
- lastVisit: newTimeInMicroseconds(),
- isRedirect: true,
- referrer: "http://" + transition + ".example.com/",
- visitCount: visitCount++,
- isInQuery: true }));
-
- // Add a REDIRECT_PERMANENT layer of visits for each of the above redirects.
- t.forEach(transition => visits.push(
- { isVisit: true,
- transType: Ci.nsINavHistoryService.TRANSITION_REDIRECT_PERMANENT,
- uri: "http://" + transition + ".redirect.perm.example.com/",
- title: transition + "-redirect-perm-example",
- lastVisit: newTimeInMicroseconds(),
- isRedirect: true,
- referrer: "http://" + transition + ".redirect.temp.example.com/",
- visitCount: visitCount++,
- isInQuery: true }));
-
- // Add a REDIRECT_PERMANENT layer of visits that loop to the first visit.
- // These entries should not change visitCount or lastVisit, otherwise
- // guessing an order would be a nightmare.
- function getLastValue(aURI, aProperty) {
- for (let i = 0; i < visits.length; i++) {
- if (visits[i].uri == aURI) {
- return visits[i][aProperty];
- }
- }
- do_throw("Unknown uri.");
- return null;
- }
- t.forEach(transition => visits.push(
- { isVisit: true,
- transType: Ci.nsINavHistoryService.TRANSITION_REDIRECT_PERMANENT,
- uri: "http://" + transition + ".example.com/",
- title: getLastValue("http://" + transition + ".example.com/", "title"),
- lastVisit: getLastValue("http://" + transition + ".example.com/", "lastVisit"),
- isRedirect: true,
- referrer: "http://" + transition + ".redirect.perm.example.com/",
- visitCount: getLastValue("http://" + transition + ".example.com/", "visitCount"),
- isInQuery: true }));
-
- // Add an unvisited bookmark in the database, it should never appear.
- visits.push({ isBookmark: true,
- uri: "http://unvisited.bookmark.com/",
- parentGuid: PlacesUtils.bookmarks.menuGuid,
- index: PlacesUtils.bookmarks.DEFAULT_INDEX,
- title: "Unvisited Bookmark",
- isInQuery: false });
-
- // Put visits in the database.
- yield task_populateDB(visits);
-});
-
-add_task(function* test_redirects()
-{
- // Frecency and hidden are updated asynchronously, wait for them.
- yield PlacesTestUtils.promiseAsyncUpdates();
-
- // This array will be used by cartProd to generate a matrix of all possible
- // combinations.
- let includeHidden_options = [true, false];
- let maxResults_options = [5, 10, 20, null];
- // These sortingMode are choosen to toggle using special queries for history
- // menu and most visited smart bookmark.
- let sorting_options = [Ci.nsINavHistoryQueryOptions.SORT_BY_NONE,
- Ci.nsINavHistoryQueryOptions.SORT_BY_VISITCOUNT_DESCENDING,
- Ci.nsINavHistoryQueryOptions.SORT_BY_DATE_DESCENDING];
- // Will execute check_results_callback() for each generated combination.
- cartProd([includeHidden_options, maxResults_options, sorting_options],
- check_results_callback);
-
- yield PlacesUtils.bookmarks.eraseEverything();
-
- yield PlacesTestUtils.clearHistory();
-});