1f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickdescription("Tests that when multiple requests are waiting for permission, no callbacks are invoked until permission is allowed.");
2f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
3f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickif (window.layoutTestController)
4f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    window.layoutTestController.setMockGeolocationPosition(51.478, -0.166, 100);
5f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
6f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickfunction allowPermission() {
7f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    permissionSet = true;
8f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (window.layoutTestController)
9f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        layoutTestController.setGeolocationPermission(true);
10f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
11f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
12f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickvar watchCallbackInvoked = false;
13f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickvar oneShotCallbackInvoked = false;
14f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
15f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricknavigator.geolocation.watchPosition(function() {
16f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (permissionSet) {
17f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        testPassed('Success callback invoked');
18f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        watchCallbackInvoked = true;
19f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        maybeFinishTest();
20f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return;
21f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
22f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    testFailed('Success callback invoked unexpectedly');
23f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    finishJSTest();
24f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}, function(err) {
25f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    testFailed('Error callback invoked unexpectedly');
26f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    finishJSTest();
27f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick});
28f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
29f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricknavigator.geolocation.getCurrentPosition(function() {
30f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (permissionSet) {
31f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        testPassed('Success callback invoked');
32f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        oneShotCallbackInvoked = true;
33f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        maybeFinishTest();
34f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return;
35f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
36f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    testFailed('Success callback invoked unexpectedly');
37f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    finishJSTest();
38f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}, function(err) {
39f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    testFailed('Error callback invoked unexpectedly');
40f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    finishJSTest();
41f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick});
42f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
43f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickwindow.setTimeout(allowPermission, 100);
44f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
45f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickfunction maybeFinishTest() {
46f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (watchCallbackInvoked && oneShotCallbackInvoked)
47f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        finishJSTest();
48f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
49f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
50f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickwindow.jsTestIsAsync = true;
51f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickwindow.successfullyParsed = true;
52