toolkit/components/places/tests/inline/head_autocomplete.js

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
     3  * You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 const Ci = Components.interfaces;
     6 const Cc = Components.classes;
     7 const Cr = Components.results;
     8 const Cu = Components.utils;
    10 Cu.import("resource://gre/modules/Services.jsm");
    12 // Import common head.
    13 let (commonFile = do_get_file("../head_common.js", false)) {
    14   let uri = Services.io.newFileURI(commonFile);
    15   Services.scriptloader.loadSubScript(uri.spec, this);
    16 }
    18 // Put any other stuff relative to this test folder below.
    20 XPCOMUtils.defineLazyServiceGetter(this, "gHistory",
    21                                    "@mozilla.org/browser/history;1",
    22                                    "mozIAsyncHistory");
    24 /**
    25  * @param aSearches
    26  *        Array of AutoCompleteSearch names.
    27  */
    28 function AutoCompleteInput(aSearches) {
    29   this.searches = aSearches;
    30 }
    31 AutoCompleteInput.prototype = {
    32   searches: null,
    33   minResultsForPopup: 0,
    34   timeout: 10,
    35   searchParam: "",
    36   textValue: "",
    37   disableAutoComplete: false,
    39   completeDefaultIndex: true,
    40   defaultIndex: 0,
    42   // Text selection range
    43   _selStart: 0,
    44   _selEnd: 0,
    45   get selectionStart() {
    46     return this._selStart;
    47   },
    48   get selectionEnd() {
    49     return this._selEnd;
    50   },
    51   selectTextRange: function(aStart, aEnd) {
    52     this._selStart = aStart;
    53     this._selEnd = aEnd;
    54   },
    56   onTextEntered: function() false,
    57   onTextReverted: function() false,
    59   get searchCount() {
    60     return this.searches.length;
    61   },
    62   getSearchAt: function(aIndex) {
    63     return this.searches[aIndex];
    64   },
    66   onSearchBegin: function () {},
    67   onSearchComplete: function () {},
    69   popupOpen: false,
    71   popup: {
    72     selectedIndex: -1,
    73     invalidate: function () {},
    75     QueryInterface: XPCOMUtils.generateQI([Ci.nsIAutoCompletePopup])
    76   },
    78   QueryInterface: XPCOMUtils.generateQI([Ci.nsIAutoCompleteInput])
    79 }
    81 /**
    82  * @param aSearchString
    83  *        String to search.
    84  * @param aExpectedValue
    85  *        Expected value returned by autoFill.
    86  *        May be a string, or an object like
    87  *        {
    88  *          autoFilled: the value suggested by autofill,
    89  *          completed: the value completed on user's confirmation
    90  *        }
    91  *        In the latter case this will also check that on user's confirmation
    92  *        the result's casing is correctly applied.
    93  */
    94 function ensure_results(aSearchString, aExpectedValue) {
    95   let autoFilledValue, completedValue;
    96   if (typeof(aExpectedValue) == "string") {
    97     autoFilledValue = aExpectedValue;
    98   }
    99   else {
   100     autoFilledValue = aExpectedValue.autoFilled;
   101     completedValue = aExpectedValue.completed;
   102   }
   104   // Make an AutoCompleteInput that uses our searches and confirms results.
   105   let input = new AutoCompleteInput(["urlinline"]);
   106   input.textValue = aSearchString;
   108   // Caret must be at the end for autoFill to happen.
   109   let strLen = aSearchString.length;
   110   input.selectTextRange(strLen, strLen);
   111   do_check_eq(input.selectionStart, strLen);
   112   do_check_eq(input.selectionEnd, strLen);
   114   let controller = Cc["@mozilla.org/autocomplete/controller;1"].
   115                    getService(Ci.nsIAutoCompleteController);
   116   controller.input = input;
   118   let numSearchesStarted = 0;
   119   input.onSearchBegin = function() {
   120     numSearchesStarted++;
   121     do_check_eq(numSearchesStarted, 1);
   122   };
   124   input.onSearchComplete = function() {
   125     // We should be running only one query.
   126     do_check_eq(numSearchesStarted, 1);
   128     // Check the autoFilled result.
   129     do_check_eq(input.textValue, autoFilledValue);
   131     if (completedValue) {
   132       // Now force completion and check correct casing of the result.
   133       // This ensures the controller is able to do its magic case-preserving
   134       // stuff and correct replacement of the user's casing with result's one.
   135       controller.handleEnter(false);
   136       do_check_eq(input.textValue, completedValue);
   137     }
   139     waitForCleanup(run_next_test);
   140   };
   142   do_log_info("Searching for: '" + aSearchString + "'");
   143   controller.startSearch(aSearchString);
   144 }
   146 function run_test() {
   147   do_register_cleanup(function () {
   148     Services.prefs.clearUserPref("browser.urlbar.autocomplete.enabled");
   149     Services.prefs.clearUserPref("browser.urlbar.autoFill");
   150     Services.prefs.clearUserPref("browser.urlbar.autoFill.typed");
   151   });
   153   gAutoCompleteTests.forEach(function (testData) {
   154     let [description, searchString, expectedValue, setupFunc] = testData;
   155     add_test(function () {
   156       do_log_info(description);
   157       Services.prefs.setBoolPref("browser.urlbar.autocomplete.enabled", true);
   158       Services.prefs.setBoolPref("browser.urlbar.autoFill", true);
   159       Services.prefs.setBoolPref("browser.urlbar.autoFill.typed", false);
   161       if (setupFunc) {
   162         setupFunc();
   163       }
   165       // At this point frecency could still be updating due to latest pages
   166       // updates.
   167       // This is not a problem in real life, but autocomplete tests should
   168       // return reliable resultsets, thus we have to wait.
   169       promiseAsyncUpdates().then(function () ensure_results(searchString,
   170                                                             expectedValue));
   171     })
   172   }, this);
   174   run_next_test();
   175 }
   177 let gAutoCompleteTests = [];
   178 function add_autocomplete_test(aTestData) {
   179   gAutoCompleteTests.push(aTestData);
   180 }
   182 function waitForCleanup(aCallback) {
   183   remove_all_bookmarks();
   184   promiseClearHistory().then(aCallback);
   185 }
   187 function addBookmark(aBookmarkObj) {
   188   do_check_true(!!aBookmarkObj.url);
   189   let parentId = aBookmarkObj.parentId ? aBookmarkObj.parentId
   190                                        : PlacesUtils.unfiledBookmarksFolderId;
   191   let itemId = PlacesUtils.bookmarks
   192                           .insertBookmark(parentId,
   193                                           NetUtil.newURI(aBookmarkObj.url),
   194                                           PlacesUtils.bookmarks.DEFAULT_INDEX,
   195                                           "A bookmark");
   196   if (aBookmarkObj.keyword) {
   197     PlacesUtils.bookmarks.setKeywordForBookmark(itemId, aBookmarkObj.keyword);
   198   }
   199 }

mercurial