зеркало из https://github.com/mozilla/gecko-dev.git
Bug 883390 - Part 2 - Add initial tests for autocomplete popup. r=jimm
--HG-- rename : browser/metro/base/content/bindings/autocomplete.xml => browser/metro/base/content/bindings/urlbar.xml extra : rebase_source : d13c3aac364c32cf006984a191e9625816ac8fcd
This commit is contained in:
Родитель
503e0d2c54
Коммит
2935833876
|
@ -12,6 +12,7 @@ include $(DEPTH)/config/autoconf.mk
|
|||
|
||||
BROWSER_TESTS = \
|
||||
head.js \
|
||||
browser_urlbar.js \
|
||||
browser_bookmarks.js \
|
||||
browser_canonizeURL.js \
|
||||
browser_context_menu_tests.js \
|
||||
|
@ -60,6 +61,7 @@ BROWSER_TEST_RESOURCES = \
|
|||
res/textblock01.html \
|
||||
res/textinput01.html \
|
||||
res/textarea01.html \
|
||||
res/testEngine.xml \
|
||||
$(NULL)
|
||||
|
||||
libs:: $(BROWSER_TESTS)
|
||||
|
|
|
@ -0,0 +1,232 @@
|
|||
// -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; js2-basic-offset: 2; js2-skip-preprocessor-directives: t; -*-
|
||||
/* 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/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
var gEdit = null;
|
||||
|
||||
/*=============================================================================
|
||||
Search engine mocking utilities
|
||||
=============================================================================*/
|
||||
|
||||
var gEngine = null;
|
||||
|
||||
const kSearchEngineName = "Foo";
|
||||
const kSearchEngineURI = chromeRoot + "res/testEngine.xml";
|
||||
|
||||
/*
|
||||
* addMockSearchDefault - adds a mock search engine to the top of the engine list.
|
||||
*/
|
||||
function addMockSearchDefault(aTimeoutMs) {
|
||||
let deferred = Promise.defer();
|
||||
let timeoutMs = aTimeoutMs || kDefaultWait;
|
||||
let timerID = 0;
|
||||
|
||||
function engineAddObserver(aSubject, aTopic, aData) {
|
||||
if (aData != "engine-added")
|
||||
return;
|
||||
|
||||
gEngine = Services.search.getEngineByName(kSearchEngineName);
|
||||
Services.obs.removeObserver(engineAddObserver, "browser-search-engine-modified");
|
||||
clearTimeout(timerID);
|
||||
gEngine.hidden = false;
|
||||
ok(gEngine, "mock engine was added");
|
||||
deferred.resolve();
|
||||
}
|
||||
|
||||
if (gEngine) {
|
||||
deferred.resolve();
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
timerID = setTimeout(function ids_canceller() {
|
||||
Services.obs.removeObserver(engineAddObserver, "browser-search-engine-modified");
|
||||
deferred.reject(new Error("search add timeout"));
|
||||
}, timeoutMs);
|
||||
|
||||
Services.obs.addObserver(engineAddObserver, "browser-search-engine-modified", false);
|
||||
Services.search.addEngine(kSearchEngineURI, Ci.nsISearchEngine.DATA_XML,
|
||||
"data:image/x-icon,%00", false);
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
/*
|
||||
* removeMockSearchDefault - removes mock "Foo" search engine.
|
||||
*/
|
||||
|
||||
function removeMockSearchDefault(aTimeoutMs) {
|
||||
let deferred = Promise.defer();
|
||||
let timeoutMs = aTimeoutMs || kDefaultWait;
|
||||
let timerID = 0;
|
||||
|
||||
function engineRemoveObserver(aSubject, aTopic, aData) {
|
||||
if (aData != "engine-removed")
|
||||
return;
|
||||
|
||||
clearTimeout(timerID);
|
||||
gEngine = null;
|
||||
Services.obs.removeObserver(engineRemoveObserver, "browser-search-engine-modified");
|
||||
deferred.resolve();
|
||||
}
|
||||
|
||||
if (!gEngine) {
|
||||
deferred.resolve();
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
timerID = setTimeout(function ids_canceller() {
|
||||
Services.obs.removeObserver(engineRemoveObserver, "browser-search-engine-modified");
|
||||
deferred.reject(new Error("search remove timeout"));
|
||||
}, timeoutMs);
|
||||
|
||||
Services.obs.addObserver(engineRemoveObserver, "browser-search-engine-modified", false);
|
||||
Services.search.removeEngine(gEngine);
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
/*=============================================================================
|
||||
Test cases
|
||||
=============================================================================*/
|
||||
|
||||
function test() {
|
||||
runTests();
|
||||
}
|
||||
|
||||
|
||||
function setUp() {
|
||||
if (!gEdit)
|
||||
gEdit = document.getElementById("urlbar-edit");
|
||||
|
||||
yield addTab("about:start");
|
||||
yield showNavBar();
|
||||
yield waitForCondition(function () {
|
||||
return StartUI.isStartPageVisible;
|
||||
});
|
||||
}
|
||||
|
||||
function tearDown() {
|
||||
yield removeMockSearchDefault();
|
||||
Browser.closeTab(Browser.selectedTab, { forceClose: true });
|
||||
delete window.r;
|
||||
}
|
||||
|
||||
gTests.push({
|
||||
desc: "search engines update",
|
||||
setUp: setUp,
|
||||
tearDown: tearDown,
|
||||
run: function testSearchEngine() {
|
||||
// If the XBL hasn't initialized yet, open the popup so that it will.
|
||||
if (gEdit.popup._searches == undefined) {
|
||||
gEdit.openPopup();
|
||||
gEdit.closePopup();
|
||||
}
|
||||
|
||||
let numSearches = gEdit.popup._searches.itemCount;
|
||||
function getEngineItem() {
|
||||
return gEdit.popup._searches.querySelector("richgriditem[value="+kSearchEngineName+"]");
|
||||
}
|
||||
|
||||
yield addMockSearchDefault();
|
||||
ok(gEdit.popup._searches.itemCount == numSearches + 1, "added search engine count");
|
||||
ok(getEngineItem(), "added search engine item");
|
||||
|
||||
yield removeMockSearchDefault();
|
||||
ok(gEdit.popup._searches.itemCount == numSearches, "normal search engine count");
|
||||
ok(!getEngineItem(), "added search engine item");
|
||||
}
|
||||
});
|
||||
|
||||
gTests.push({
|
||||
desc: "display autocomplete while typing, handle enter",
|
||||
setUp: setUp,
|
||||
tearDown: tearDown,
|
||||
run: function testUrlbarTyping() {
|
||||
sendElementTap(window, gEdit);
|
||||
ok(gEdit.isEditing, "focus urlbar: in editing mode");
|
||||
ok(!gEdit.popup.popupOpen, "focus urlbar: popup not open yet");
|
||||
|
||||
EventUtils.sendString("about:blank", window);
|
||||
let opened = yield waitForCondition(() => gEdit.popup.popupOpen);
|
||||
ok(opened, "type in urlbar: popup opens");
|
||||
|
||||
EventUtils.synthesizeKey("VK_RETURN", {}, window);
|
||||
let closed = yield waitForCondition(() => !gEdit.popup.popupOpen);
|
||||
ok(closed, "hit enter in urlbar: popup closes, page loads");
|
||||
ok(!gEdit.isEditing, "hit enter in urlbar: not in editing mode");
|
||||
}
|
||||
});
|
||||
|
||||
gTests.push({
|
||||
desc: "display and select a search with keyboard",
|
||||
setUp: setUp,
|
||||
tearDown: tearDown,
|
||||
run: function testSearchKeyboard() {
|
||||
yield addMockSearchDefault();
|
||||
|
||||
sendElementTap(window, gEdit);
|
||||
ok(gEdit.isEditing, "focus urlbar: in editing mode");
|
||||
ok(!gEdit.popup.popupOpen, "focus urlbar: popup not open yet");
|
||||
|
||||
let search = "mozilla";
|
||||
EventUtils.sendString(search, window);
|
||||
yield waitForCondition(() => gEdit.popup.popupOpen);
|
||||
|
||||
// XXX We should probably change the keyboard selection behavior entirely,
|
||||
// given that it makes little to no sense, but that's a job for a later patch.
|
||||
|
||||
EventUtils.synthesizeKey("VK_DOWN", {}, window);
|
||||
is(gEdit.popup.selectedIndex, -1, "key select search: no result selected");
|
||||
is(gEdit.popup._searches.selectedIndex, 0, "key select search: first search selected");
|
||||
|
||||
let engines = Services.search.getVisibleEngines();
|
||||
for (let i = 0, max = engines.length - 1; i < max; i++) {
|
||||
is(gEdit.popup._searches.selectedIndex, i, "key select search: next index");
|
||||
EventUtils.synthesizeKey("VK_DOWN", {}, window);
|
||||
}
|
||||
|
||||
let existingValue = gEdit.value;
|
||||
EventUtils.synthesizeKey("VK_RETURN", {}, window);
|
||||
|
||||
yield waitForCondition(() => gEdit.value != existingValue);
|
||||
|
||||
let closed = yield waitForCondition(() => !gEdit.popup.popupOpen);
|
||||
ok(closed, "hit enter in urlbar: popup closes, page loads");
|
||||
ok(!gEdit.isEditing, "hit enter in urlbar: not in editing mode");
|
||||
|
||||
let searchSubmission = gEngine.getSubmission(search, null);
|
||||
let trimmedSubmission = gEdit.trimValue(searchSubmission.uri.spec);
|
||||
is(gEdit.value, trimmedSubmission, "hit enter in urlbar: search conducted");
|
||||
|
||||
yield removeMockSearchDefault();
|
||||
}
|
||||
});
|
||||
|
||||
gTests.push({
|
||||
desc: "display and select a search with touch",
|
||||
setUp: setUp,
|
||||
tearDown: tearDown,
|
||||
run: function testUrlbarSearchesTouch() {
|
||||
yield addMockSearchDefault();
|
||||
|
||||
sendElementTap(window, gEdit);
|
||||
ok(gEdit.isEditing, "focus urlbar: in editing mode");
|
||||
ok(!gEdit.popup.popupOpen, "focus urlbar: popup not open yet");
|
||||
|
||||
let search = "mozilla";
|
||||
EventUtils.sendString(search, window);
|
||||
yield waitForCondition(() => gEdit.popup.popupOpen);
|
||||
|
||||
sendElementTap(window, gEdit.popup._searches.lastChild);
|
||||
|
||||
let closed = yield waitForCondition(() => !gEdit.popup.popupOpen);
|
||||
ok(closed, "tap search option: popup closes, page loads");
|
||||
ok(!gEdit.isEditing, "tap search option: not in editing mode");
|
||||
|
||||
let searchSubmission = gEngine.getSubmission(search, null);
|
||||
let trimmedSubmission = gEdit.trimValue(searchSubmission.uri.spec);
|
||||
is(gEdit.value, trimmedSubmission, "tap search option: search conducted");
|
||||
}
|
||||
});
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"
|
||||
xmlns:moz="http://www.mozilla.org/2006/browser/search/">
|
||||
<ShortName>Foo</ShortName>
|
||||
<Description>Foo Search</Description>
|
||||
<InputEncoding>utf-8</InputEncoding>
|
||||
<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGklEQVQoz2NgGB6AnZ1dUlJSXl4eSDIyMhLW4Ovr%2B%2Fr168uXL69Zs4YoG%2BLi4i5dusTExMTGxsbNzd3f37937976%2BnpmZmagbHR09J49e5YvX66kpATVEBYW9ubNm2nTphkbG7e2tp44cQLIuHfvXm5urpaWFlDKysqqu7v73LlzECMYIiIiHj58mJCQoKKicvXq1bS0NKBgW1vbjh074uPjgeqAXE1NzSdPnvDz84M0AEUvXLgAsW379u1z5swBen3jxo2zZ892cHB4%2BvQp0KlAfwI1cHJyghQFBwfv2rULokFXV%2FfixYu7d%2B8GGqGgoMDKyrpu3br9%2B%2FcDuXl5eVA%2FAEWBfoWHAdAYoNuAYQ0XAeoUERFhGDYAAPoUaT2dfWJuAAAAAElFTkSuQmCC</Image>
|
||||
<Url type="text/html" method="GET" template="http://mochi.test:8888/browser/browser/components/search/test/?search">
|
||||
<Param name="test" value="{searchTerms}"/>
|
||||
</Url>
|
||||
<moz:SearchForm>http://mochi.test:8888/browser/browser/components/search/test/</moz:SearchForm>
|
||||
<moz:Alias>fooalias</moz:Alias>
|
||||
</OpenSearchDescription>
|
Загрузка…
Ссылка в новой задаче