зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1330111 - Test changes for opening username autocomplete. r=johannh
MozReview-Commit-ID: CJKpsRmWorm
This commit is contained in:
Родитель
0cda4589e3
Коммит
dcdc8e9897
|
@ -64,4 +64,6 @@ skip-if = os == "linux" || toolkit == 'android' # Tests desktop prompts
|
||||||
[test_prompt_promptAuth_proxy.html]
|
[test_prompt_promptAuth_proxy.html]
|
||||||
skip-if = e10s || os == "linux" || toolkit == 'android' # Tests desktop prompts
|
skip-if = e10s || os == "linux" || toolkit == 'android' # Tests desktop prompts
|
||||||
[test_recipe_login_fields.html]
|
[test_recipe_login_fields.html]
|
||||||
|
[test_username_focus.html]
|
||||||
|
skip-if = toolkit == 'android' # android:autocomplete.
|
||||||
[test_xhr_2.html]
|
[test_xhr_2.html]
|
||||||
|
|
|
@ -56,6 +56,8 @@ add_task(function* setup() {
|
||||||
});
|
});
|
||||||
|
|
||||||
iframeDoc = iframe.contentDocument;
|
iframeDoc = iframe.contentDocument;
|
||||||
|
|
||||||
|
SimpleTest.requestFlakyTimeout("Giving a chance for the unexpected popupshown to occur");
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(function* test_initial_focus() {
|
add_task(function* test_initial_focus() {
|
||||||
|
@ -69,17 +71,41 @@ add_task(function* test_initial_focus() {
|
||||||
is(popupState.open, false, "Check popup is now closed");
|
is(popupState.open, false, "Check popup is now closed");
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(function* test_not_reopened_after_selecting() {
|
// This depends on the filling from the previous test.
|
||||||
let formFillController = SpecialPowers.Cc["@mozilla.org/satchel/form-fill-controller;1"].
|
add_task(function* test_not_reopened_if_filled() {
|
||||||
getService(SpecialPowers.Ci.nsIFormFillController);
|
|
||||||
let usernameField = iframeDoc.getElementById("form-basic-username");
|
|
||||||
listenForUnexpectedPopupShown();
|
listenForUnexpectedPopupShown();
|
||||||
formFillController.markAsLoginManagerField(usernameField);
|
let usernameField = iframeDoc.getElementById("form-basic-username");
|
||||||
SimpleTest.requestFlakyTimeout("Giving a chance for the unexpected popupshown to occur");
|
usernameField.focus();
|
||||||
|
info("Waiting to see if a popupshown occurs");
|
||||||
yield new Promise(resolve => setTimeout(resolve, 1000));
|
yield new Promise(resolve => setTimeout(resolve, 1000));
|
||||||
|
|
||||||
// cleanup
|
// cleanup
|
||||||
gPopupShownExpected = true;
|
gPopupShownExpected = true;
|
||||||
|
iframeDoc.getElementById("form-basic-submit").focus();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_reopened_after_edit_not_matching_saved() {
|
||||||
|
let usernameField = iframeDoc.getElementById("form-basic-username");
|
||||||
|
usernameField.value = "nam";
|
||||||
|
let shownPromise = promiseACShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield shownPromise;
|
||||||
|
iframeDoc.getElementById("form-basic-submit").focus();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_not_reopened_after_selecting() {
|
||||||
|
let formFillController = SpecialPowers.Cc["@mozilla.org/satchel/form-fill-controller;1"].
|
||||||
|
getService(SpecialPowers.Ci.nsIFormFillController);
|
||||||
|
let usernameField = iframeDoc.getElementById("form-basic-username");
|
||||||
|
usernameField.value = "";
|
||||||
|
iframeDoc.getElementById("form-basic-password").value = "";
|
||||||
|
listenForUnexpectedPopupShown();
|
||||||
|
formFillController.markAsLoginManagerField(usernameField);
|
||||||
|
info("Waiting to see if a popupshown occurs");
|
||||||
|
yield new Promise(resolve => setTimeout(resolve, 1000));
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
gPopupShownExpected = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -833,6 +833,9 @@ add_task(function* test_form12_open_on_trusted_focus() {
|
||||||
uname.value = "";
|
uname.value = "";
|
||||||
pword.value = "";
|
pword.value = "";
|
||||||
|
|
||||||
|
// Move focus to the password field so we can test the first click on the
|
||||||
|
// username field.
|
||||||
|
pword.focus();
|
||||||
checkACForm("", "");
|
checkACForm("", "");
|
||||||
const firePrivEventPromise = new Promise((resolve) => {
|
const firePrivEventPromise = new Promise((resolve) => {
|
||||||
uname.addEventListener("click", (e) => {
|
uname.addEventListener("click", (e) => {
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Test basic login autocomplete</title>
|
<title>Test insecure form field autocomplete</title>
|
||||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
<script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
|
<script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
|
||||||
<script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
|
<script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
|
||||||
|
@ -11,7 +11,6 @@
|
||||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
Login Manager test: multiple login autocomplete
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
var chromeScript = runChecksAfterCommonInit();
|
var chromeScript = runChecksAfterCommonInit();
|
||||||
|
|
|
@ -0,0 +1,263 @@
|
||||||
|
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Test interaction between autocomplete and focus on username fields</title>
|
||||||
|
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
|
||||||
|
<script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
|
||||||
|
<script type="text/javascript" src="satchel_common.js"></script>
|
||||||
|
<script type="text/javascript" src="pwmgr_common.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
let pwmgrCommonScript = runInParent(SimpleTest.getTestFileURL("pwmgr_common.js"));
|
||||||
|
|
||||||
|
let readyPromise = registerRunTests();
|
||||||
|
let chromeScript = runInParent(function chromeSetup() {
|
||||||
|
const { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components;
|
||||||
|
let pwmgr = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
|
||||||
|
|
||||||
|
let login1A = Cc["@mozilla.org/login-manager/loginInfo;1"].
|
||||||
|
createInstance(Ci.nsILoginInfo);
|
||||||
|
let login1B = Cc["@mozilla.org/login-manager/loginInfo;1"].
|
||||||
|
createInstance(Ci.nsILoginInfo);
|
||||||
|
let login2A = Cc["@mozilla.org/login-manager/loginInfo;1"].
|
||||||
|
createInstance(Ci.nsILoginInfo);
|
||||||
|
let login2B = Cc["@mozilla.org/login-manager/loginInfo;1"].
|
||||||
|
createInstance(Ci.nsILoginInfo);
|
||||||
|
let login2C = Cc["@mozilla.org/login-manager/loginInfo;1"].
|
||||||
|
createInstance(Ci.nsILoginInfo);
|
||||||
|
|
||||||
|
login1A.init("http://mochi.test:8888", "http://username-focus-1", null,
|
||||||
|
"testuser1A", "testpass1A", "", "");
|
||||||
|
|
||||||
|
login2A.init("http://mochi.test:8888", "http://username-focus-2", null,
|
||||||
|
"testuser2A", "testpass2A", "", "");
|
||||||
|
login2B.init("http://mochi.test:8888", "http://username-focus-2", null,
|
||||||
|
"testuser2B", "testpass2B", "", "");
|
||||||
|
|
||||||
|
pwmgr.addLogin(login1A);
|
||||||
|
pwmgr.addLogin(login2A);
|
||||||
|
pwmgr.addLogin(login2B);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<p id="display"></p>
|
||||||
|
<div id="content">
|
||||||
|
<!-- first 3 forms have a matching user+pass login -->
|
||||||
|
|
||||||
|
<!-- user+pass form. -->
|
||||||
|
<form id="form-autofilled" action="http://username-focus-1">
|
||||||
|
<input type="text" name="uname">
|
||||||
|
<input type="password" name="pword">
|
||||||
|
<button type="submit" name="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<!-- user+pass form, username prefilled -->
|
||||||
|
<form id="form-autofilled-prefilled-un" action="http://username-focus-1">
|
||||||
|
<input type="text" name="uname" value="testuser1A">
|
||||||
|
<input type="password" name="pword">
|
||||||
|
<button type="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<!-- user+pass form. -->
|
||||||
|
<form id="form-autofilled-focused-dynamic" action="http://username-focus-1">
|
||||||
|
<input type="text" name="uname">
|
||||||
|
<input type="not-yet-password" name="pword">
|
||||||
|
<button type="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- next 5 forms have matching user+pass (2x) logins -->
|
||||||
|
|
||||||
|
<!-- user+pass form. -->
|
||||||
|
<form id="form-multiple" action="http://username-focus-2">
|
||||||
|
<input type="text" name="uname">
|
||||||
|
<input type="password" name="pword">
|
||||||
|
<button type="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<!-- user+pass form dynamic with existing focus -->
|
||||||
|
<form id="form-multiple-dynamic" action="http://username-focus-2">
|
||||||
|
<input type="text" name="uname">
|
||||||
|
<input type="not-yet-password" name="pword">
|
||||||
|
<button type="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<!-- user+pass form, username prefilled -->
|
||||||
|
<form id="form-multiple-prefilled-un1" action="http://username-focus-2">
|
||||||
|
<input type="text" name="uname" value="testuser2A">
|
||||||
|
<input type="password" name="pword">
|
||||||
|
<button type="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<!-- user+pass form, different username prefilled -->
|
||||||
|
<form id="form-multiple-prefilled-un2" action="http://username-focus-2">
|
||||||
|
<input type="text" name="uname" value="testuser2B">
|
||||||
|
<input type="password" name="pword">
|
||||||
|
<button type="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<!-- user+pass form, username prefilled with existing focus -->
|
||||||
|
<form id="form-multiple-prefilled-focused-dynamic" action="http://username-focus-2">
|
||||||
|
<input type="text" name="uname" value="testuser2B">
|
||||||
|
<input type="not-yet-password" name="pword">
|
||||||
|
<button type="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<pre id="test">
|
||||||
|
<script class="testbody" type="text/javascript">
|
||||||
|
function removeFocus() {
|
||||||
|
$_("-autofilled", "submit").focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
add_task(function* setup() {
|
||||||
|
yield SpecialPowers.pushPrefEnv({"set": [
|
||||||
|
["security.insecure_field_warning.contextual.enabled", false],
|
||||||
|
]});
|
||||||
|
|
||||||
|
ok(readyPromise, "check promise is available");
|
||||||
|
yield readyPromise;
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_autofilled() {
|
||||||
|
let usernameField = $_("-autofilled", "uname");
|
||||||
|
info("Username and password already filled so don't show autocomplete");
|
||||||
|
let noPopupPromise = promiseNoUnexpectedPopupShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield noPopupPromise;
|
||||||
|
|
||||||
|
removeFocus();
|
||||||
|
usernameField.value = "testuser";
|
||||||
|
info("Focus when we don't have an exact match");
|
||||||
|
shownPromise = promiseACShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield shownPromise;
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_autofilled_prefilled_un() {
|
||||||
|
let usernameField = $_("-autofilled-prefilled-un", "uname");
|
||||||
|
info("Username and password already filled so don't show autocomplete");
|
||||||
|
let noPopupPromise = promiseNoUnexpectedPopupShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield noPopupPromise;
|
||||||
|
|
||||||
|
removeFocus();
|
||||||
|
usernameField.value = "testuser";
|
||||||
|
info("Focus when we don't have an exact match");
|
||||||
|
shownPromise = promiseACShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield shownPromise;
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_autofilled_focused_dynamic() {
|
||||||
|
let usernameField = $_("-autofilled-focused-dynamic", "uname");
|
||||||
|
let passwordField = $_("-autofilled-focused-dynamic", "pword");
|
||||||
|
info("Username and password will be filled while username focused");
|
||||||
|
let noPopupPromise = promiseNoUnexpectedPopupShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield noPopupPromise;
|
||||||
|
info("triggering autofill");
|
||||||
|
noPopupPromise = promiseNoUnexpectedPopupShown();
|
||||||
|
passwordField.type = "password";
|
||||||
|
yield noPopupPromise;
|
||||||
|
|
||||||
|
let popupState = yield getPopupState();
|
||||||
|
is(popupState.open, false, "Check popup is closed");
|
||||||
|
|
||||||
|
removeFocus();
|
||||||
|
passwordField.value = "test";
|
||||||
|
info("Focus when we don't have an exact match");
|
||||||
|
shownPromise = promiseACShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield shownPromise;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Begin testing forms that have multiple saved logins
|
||||||
|
|
||||||
|
add_task(function* test_multiple() {
|
||||||
|
let usernameField = $_("-multiple", "uname");
|
||||||
|
info("Fields not filled due to multiple so autocomplete upon focus");
|
||||||
|
shownPromise = promiseACShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield shownPromise;
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_multiple_dynamic() {
|
||||||
|
let usernameField = $_("-multiple-dynamic", "uname");
|
||||||
|
let passwordField = $_("-multiple-dynamic", "pword");
|
||||||
|
info("Fields not filled but username is focused upon marking so open");
|
||||||
|
let noPopupPromise = promiseNoUnexpectedPopupShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield noPopupPromise;
|
||||||
|
|
||||||
|
info("triggering _fillForm code");
|
||||||
|
let shownPromise = promiseACShown();
|
||||||
|
passwordField.type = "password";
|
||||||
|
yield shownPromise;
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_multiple_prefilled_un1() {
|
||||||
|
let usernameField = $_("-multiple-prefilled-un1", "uname");
|
||||||
|
info("Username and password already filled so don't show autocomplete");
|
||||||
|
let noPopupPromise = promiseNoUnexpectedPopupShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield noPopupPromise;
|
||||||
|
|
||||||
|
removeFocus();
|
||||||
|
usernameField.value = "testuser";
|
||||||
|
info("Focus when we don't have an exact match");
|
||||||
|
shownPromise = promiseACShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield shownPromise;
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_multiple_prefilled_un2() {
|
||||||
|
let usernameField = $_("-multiple-prefilled-un2", "uname");
|
||||||
|
info("Username and password already filled so don't show autocomplete");
|
||||||
|
let noPopupPromise = promiseNoUnexpectedPopupShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield noPopupPromise;
|
||||||
|
|
||||||
|
removeFocus();
|
||||||
|
usernameField.value = "testuser";
|
||||||
|
info("Focus when we don't have an exact match");
|
||||||
|
shownPromise = promiseACShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield shownPromise;
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* test_multiple_prefilled_focused_dynamic() {
|
||||||
|
let usernameField = $_("-multiple-prefilled-focused-dynamic", "uname");
|
||||||
|
let passwordField = $_("-multiple-prefilled-focused-dynamic", "pword");
|
||||||
|
info("Username and password will be filled while username focused");
|
||||||
|
let noPopupPromise = promiseNoUnexpectedPopupShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield noPopupPromise;
|
||||||
|
info("triggering autofill");
|
||||||
|
noPopupPromise = promiseNoUnexpectedPopupShown();
|
||||||
|
passwordField.type = "password";
|
||||||
|
yield noPopupPromise;
|
||||||
|
|
||||||
|
let popupState = yield getPopupState();
|
||||||
|
is(popupState.open, false, "Check popup is closed");
|
||||||
|
|
||||||
|
removeFocus();
|
||||||
|
passwordField.value = "test";
|
||||||
|
info("Focus when we don't have an exact match");
|
||||||
|
shownPromise = promiseACShown();
|
||||||
|
usernameField.focus();
|
||||||
|
yield shownPromise;
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* cleanup() {
|
||||||
|
removeFocus();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</pre>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -166,35 +166,38 @@ function commonInit(selfFilling) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function registerRunTests() {
|
function registerRunTests() {
|
||||||
// We provide a general mechanism for our tests to know when they can
|
return new Promise(resolve => {
|
||||||
// safely run: we add a final form that we know will be filled in, wait
|
// We provide a general mechanism for our tests to know when they can
|
||||||
// for the login manager to tell us that it's filled in and then continue
|
// safely run: we add a final form that we know will be filled in, wait
|
||||||
// with the rest of the tests.
|
// for the login manager to tell us that it's filled in and then continue
|
||||||
window.addEventListener("DOMContentLoaded", (event) => {
|
// with the rest of the tests.
|
||||||
var form = document.createElement("form");
|
window.addEventListener("DOMContentLoaded", (event) => {
|
||||||
form.id = "observerforcer";
|
var form = document.createElement("form");
|
||||||
var username = document.createElement("input");
|
form.id = "observerforcer";
|
||||||
username.name = "testuser";
|
var username = document.createElement("input");
|
||||||
form.appendChild(username);
|
username.name = "testuser";
|
||||||
var password = document.createElement("input");
|
form.appendChild(username);
|
||||||
password.name = "testpass";
|
var password = document.createElement("input");
|
||||||
password.type = "password";
|
password.name = "testpass";
|
||||||
form.appendChild(password);
|
password.type = "password";
|
||||||
|
form.appendChild(password);
|
||||||
|
|
||||||
var observer = SpecialPowers.wrapCallback(function(subject, topic, data) {
|
var observer = SpecialPowers.wrapCallback(function(subject, topic, data) {
|
||||||
var formLikeRoot = subject.QueryInterface(SpecialPowers.Ci.nsIDOMNode);
|
var formLikeRoot = subject.QueryInterface(SpecialPowers.Ci.nsIDOMNode);
|
||||||
if (formLikeRoot.id !== "observerforcer")
|
if (formLikeRoot.id !== "observerforcer")
|
||||||
return;
|
return;
|
||||||
SpecialPowers.removeObserver(observer, "passwordmgr-processed-form");
|
SpecialPowers.removeObserver(observer, "passwordmgr-processed-form");
|
||||||
formLikeRoot.remove();
|
formLikeRoot.remove();
|
||||||
SimpleTest.executeSoon(() => {
|
SimpleTest.executeSoon(() => {
|
||||||
var runTestEvent = new Event("runTests");
|
var runTestEvent = new Event("runTests");
|
||||||
window.dispatchEvent(runTestEvent);
|
window.dispatchEvent(runTestEvent);
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
SpecialPowers.addObserver(observer, "passwordmgr-processed-form", false);
|
||||||
SpecialPowers.addObserver(observer, "passwordmgr-processed-form", false);
|
|
||||||
|
|
||||||
document.body.appendChild(form);
|
document.body.appendChild(form);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -229,11 +229,18 @@ function getPopupState(then = null) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function listenForUnexpectedPopupShown() {
|
function listenForUnexpectedPopupShown() {
|
||||||
gChromeScript.addMessageListener("onpopupshown", function onPopupShown() {
|
gPopupShownListener = function onPopupShown() {
|
||||||
if (!gPopupShownExpected) {
|
if (!gPopupShownExpected) {
|
||||||
ok(false, "Unexpected autocomplete popupshown event");
|
ok(false, "Unexpected autocomplete popupshown event");
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function* promiseNoUnexpectedPopupShown() {
|
||||||
|
gPopupShownExpected = false;
|
||||||
|
listenForUnexpectedPopupShown();
|
||||||
|
SimpleTest.requestFlakyTimeout("Giving a chance for an unexpected popupshown to occur");
|
||||||
|
yield new Promise(resolve => setTimeout(resolve, 1000));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -243,10 +250,10 @@ function listenForUnexpectedPopupShown() {
|
||||||
function promiseACShown() {
|
function promiseACShown() {
|
||||||
gPopupShownExpected = true;
|
gPopupShownExpected = true;
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
gChromeScript.addMessageListener("onpopupshown", ({ results }) => {
|
gPopupShownListener = ({ results }) => {
|
||||||
gPopupShownExpected = false;
|
gPopupShownExpected = false;
|
||||||
resolve(results);
|
resolve(results);
|
||||||
});
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,7 +263,7 @@ function satchelCommonSetup() {
|
||||||
gChromeScript.addMessageListener("onpopupshown", ({ results }) => {
|
gChromeScript.addMessageListener("onpopupshown", ({ results }) => {
|
||||||
gLastAutoCompleteResults = results;
|
gLastAutoCompleteResults = results;
|
||||||
if (gPopupShownListener)
|
if (gPopupShownListener)
|
||||||
gPopupShownListener();
|
gPopupShownListener({results});
|
||||||
});
|
});
|
||||||
|
|
||||||
SimpleTest.registerCleanupFunction(() => {
|
SimpleTest.registerCleanupFunction(() => {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче