Bug 489813 - Fire timeout error if provider fails to response after initial response. Also cleans up test. r=smaug a=jst

This commit is contained in:
Doug Turner 2010-08-31 09:15:52 -07:00
Родитель 2fc02a5b23
Коммит ab58de8c89
25 изменённых файлов: 387 добавлений и 328 удалений

Просмотреть файл

@ -363,6 +363,7 @@ user_pref("extensions.testpilot.runStudies", false);
user_pref("geo.wifi.uri", "http://%(server)s/tests/dom/tests/mochitest/geolocation/network_geolocation.sjs");
user_pref("geo.wifi.testing", true);
user_pref("geo.ignore.location_filter", true);
user_pref("camino.warn_when_closing", false); // Camino-only, harmless to others

Просмотреть файл

@ -71,6 +71,7 @@
#include "nsIPrefService.h"
#include "nsIPrefBranch2.h"
#include "nsIJSContextStack.h"
#include "nsThreadUtils.h"
#include "mozilla/Services.h"
#include "mozilla/unused.h"
@ -98,6 +99,75 @@
using mozilla::unused; // <snicker>
using namespace mozilla::dom;
class RequestPromptEvent : public nsRunnable
{
public:
RequestPromptEvent(nsGeolocationRequest* request)
: mRequest(request)
{
}
NS_IMETHOD Run() {
nsCOMPtr<nsIGeolocationPrompt> prompt = do_GetService(NS_GEOLOCATION_PROMPT_CONTRACTID);
NS_ASSERTION(prompt, "null geolocation prompt");
if (prompt)
prompt->Prompt(mRequest);
return NS_OK;
}
private:
nsRefPtr<nsGeolocationRequest> mRequest;
};
class RequestAllowEvent : public nsRunnable
{
public:
RequestAllowEvent(int allow, nsGeolocationRequest* request)
: mAllow(allow),
mRequest(request)
{
}
NS_IMETHOD Run() {
if (mAllow)
mRequest->Allow();
else
mRequest->Cancel();
return NS_OK;
}
private:
PRBool mAllow;
nsRefPtr<nsGeolocationRequest> mRequest;
};
class RequestSendLocationEvent : public nsRunnable
{
public:
// a bit funky. if locator is passed, that means this
// event should remove the request from it. If we ever
// have to do more, then we can change this around.
RequestSendLocationEvent(nsIDOMGeoPosition* aPosition, nsGeolocationRequest* aRequest, nsGeolocation* aLocator = nsnull)
: mPosition(aPosition),
mRequest(aRequest),
mLocator(aLocator)
{
}
NS_IMETHOD Run() {
mRequest->SendLocation(mPosition);
if (mLocator)
mLocator->RemoveRequest(mRequest);
return NS_OK;
}
private:
nsCOMPtr<nsIDOMGeoPosition> mPosition;
nsRefPtr<nsGeolocationRequest> mRequest;
nsRefPtr<nsGeolocation> mLocator;
};
////////////////////////////////////////////////////
// nsDOMGeoPositionError
////////////////////////////////////////////////////
@ -170,7 +240,6 @@ nsGeolocationRequest::nsGeolocationRequest(nsGeolocation* aLocator,
nsIDOMGeoPositionOptions* aOptions)
: mAllowed(PR_FALSE),
mCleared(PR_FALSE),
mHasSentData(PR_FALSE),
mCallback(aCallback),
mErrorCallback(aErrorCallback),
mOptions(aOptions),
@ -227,11 +296,9 @@ nsGeolocationRequest::Notify(nsITimer* aTimer)
// provider yet, cancel the request. Same logic as
// ::Cancel, just a different error
if (!mHasSentData) {
NotifyError(nsIDOMGeoPositionError::TIMEOUT);
// remove ourselves from the locator's callback lists.
mLocator->RemoveRequest(this);
}
mTimeoutTimer = nsnull;
return NS_OK;
@ -319,10 +386,23 @@ nsGeolocationRequest::Allow()
// okay, we can return a cached position
mAllowed = PR_TRUE;
// send the cached location
SendLocation(lastPosition);
nsCOMPtr<nsIRunnable> ev = new RequestSendLocationEvent(lastPosition, this, mLocator);
NS_DispatchToMainThread(ev);
}
SetTimeoutTimer();
mAllowed = PR_TRUE;
return NS_OK;
}
void
nsGeolocationRequest::SetTimeoutTimer()
{
if (mTimeoutTimer) {
mTimeoutTimer->Cancel();
mTimeoutTimer = nsnull;
}
PRInt32 timeout;
if (mOptions && NS_SUCCEEDED(mOptions->GetTimeout(&timeout)) && timeout > 0) {
@ -332,9 +412,6 @@ nsGeolocationRequest::Allow()
mTimeoutTimer = do_CreateInstance("@mozilla.org/timer;1");
mTimeoutTimer->InitWithCallback(this, timeout, nsITimer::TYPE_ONE_SHOT);
}
mAllowed = PR_TRUE;
return NS_OK;
}
void
@ -349,6 +426,11 @@ nsGeolocationRequest::SendLocation(nsIDOMGeoPosition* aPosition)
if (mCleared || !mAllowed)
return;
if (mTimeoutTimer) {
mTimeoutTimer->Cancel();
mTimeoutTimer = nsnull;
}
// we should not pass null back to the DOM.
if (!aPosition) {
NotifyError(nsIDOMGeoPositionError::POSITION_UNAVAILABLE);
@ -366,7 +448,7 @@ nsGeolocationRequest::SendLocation(nsIDOMGeoPosition* aPosition)
JSContext* cx;
stack->Pop(&cx);
mHasSentData = PR_TRUE;
SetTimeoutTimer();
}
void
@ -401,6 +483,8 @@ NS_IMPL_THREADSAFE_RELEASE(nsGeolocationService)
static PRBool sGeoEnabled = PR_TRUE;
static PRBool sGeoIgnoreLocationFilter = PR_FALSE;
static int
GeoEnabledChangedCallback(const char *aPrefName, void *aClosure)
{
@ -408,10 +492,26 @@ GeoEnabledChangedCallback(const char *aPrefName, void *aClosure)
return 0;
}
static int
GeoIgnoreLocationFilterChangedCallback(const char *aPrefName, void *aClosure)
{
sGeoIgnoreLocationFilter = nsContentUtils::GetBoolPref("geo.ignore.location_filter",
PR_TRUE);
return 0;
}
nsresult nsGeolocationService::Init()
{
mTimeout = nsContentUtils::GetIntPref("geo.timeout", 6000);
nsContentUtils::RegisterPrefCallback("geo.ignore.location_filter",
GeoIgnoreLocationFilterChangedCallback,
nsnull);
GeoIgnoreLocationFilterChangedCallback("geo.ignore.location_filter", nsnull);
nsContentUtils::RegisterPrefCallback("geo.enabled",
GeoEnabledChangedCallback,
nsnull);
@ -771,7 +871,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsGeolocation)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
nsGeolocation::nsGeolocation()
: mUpdateInProgress(PR_FALSE)
{
}
@ -859,33 +958,21 @@ nsGeolocation::RemoveRequest(nsGeolocationRequest* aRequest)
void
nsGeolocation::Update(nsIDOMGeoPosition *aSomewhere)
{
// This method calls out to objects which may spin and
// event loop which may add new location objects into
// mPendingCallbacks, and mWatchingCallbacks. Since this
// function can only be called on the primary thread, we
// can lock this method with a member var.
if (mUpdateInProgress)
return;
mUpdateInProgress = PR_TRUE;
if (!WindowOwnerStillExists())
{
Shutdown();
return;
}
return Shutdown();
// notify anyone that has been waiting
for (PRUint32 i = 0; i< mPendingCallbacks.Length(); i++)
mPendingCallbacks[i]->SendLocation(aSomewhere);
for (PRUint32 i = 0; i< mPendingCallbacks.Length(); i++) {
nsCOMPtr<nsIRunnable> ev = new RequestSendLocationEvent(aSomewhere,
mPendingCallbacks[i]);
NS_DispatchToMainThread(ev);
}
mPendingCallbacks.Clear();
// notify everyone that is watching
for (PRUint32 i = 0; i< mWatchingCallbacks.Length(); i++)
mWatchingCallbacks[i]->SendLocation(aSomewhere);
mUpdateInProgress = PR_FALSE;
for (PRUint32 i = 0; i< mWatchingCallbacks.Length(); i++) {
nsCOMPtr<nsIRunnable> ev = new RequestSendLocationEvent(aSomewhere, mWatchingCallbacks[i]);
NS_DispatchToMainThread(ev);
}
}
NS_IMETHODIMP
@ -911,17 +998,17 @@ nsGeolocation::GetCurrentPosition(nsIDOMGeoPositionCallback *callback,
if (mOwner) {
RegisterRequestWithPrompt(request);
mPendingCallbacks.AppendElement(request);
return NS_OK;
}
if (!nsContentUtils::IsCallerChrome())
return NS_ERROR_FAILURE;
request->Allow();
mPendingCallbacks.AppendElement(request);
nsCOMPtr<nsIRunnable> ev = new RequestAllowEvent(true, request);
NS_DispatchToMainThread(ev);
return NS_OK;
}
@ -1030,10 +1117,15 @@ nsGeolocation::RegisterRequestWithPrompt(nsGeolocationRequest* request)
}
#endif
nsCOMPtr<nsIGeolocationPrompt> prompt = do_GetService(NS_GEOLOCATION_PROMPT_CONTRACTID);
NS_ASSERTION(prompt, "null geolocation prompt. geolocation will not work without one.");
if (prompt)
prompt->Prompt(request);
if (nsContentUtils::GetBoolPref("geo.prompt.testing", PR_FALSE))
{
nsCOMPtr<nsIRunnable> ev = new RequestAllowEvent(nsContentUtils::GetBoolPref("geo.prompt.testing.allow", PR_FALSE), request);
NS_DispatchToMainThread(ev);
return;
}
nsCOMPtr<nsIRunnable> ev = new RequestPromptEvent(request);
NS_DispatchToMainThread(ev);
}
#if !defined(WINCE_WINDOWS_MOBILE) && !defined(MOZ_MAEMO_LIBLOCATION) && !defined(ANDROID)

Просмотреть файл

@ -94,6 +94,7 @@ class nsGeolocationRequest
void SendLocation(nsIDOMGeoPosition* location);
void MarkCleared();
PRBool Allowed() {return mAllowed;}
void SetTimeoutTimer();
~nsGeolocationRequest();
@ -106,7 +107,6 @@ class nsGeolocationRequest
void NotifyError(PRInt16 errorCode);
PRPackedBool mAllowed;
PRPackedBool mCleared;
PRPackedBool mHasSentData;
nsCOMPtr<nsITimer> mTimeoutTimer;
nsCOMPtr<nsIDOMGeoPositionCallback> mCallback;
@ -232,8 +232,6 @@ private:
nsTArray<nsRefPtr<nsGeolocationRequest> > mPendingCallbacks;
nsTArray<nsRefPtr<nsGeolocationRequest> > mWatchingCallbacks;
PRBool mUpdateInProgress;
// window that this was created for. Weak reference.
nsWeakPtr mOwner;

Просмотреть файл

@ -177,7 +177,7 @@ GPSDProvider.prototype = {
watch: function(c) {
LOG("watch called\n");
try {
// Turn GPSD buffer on, results in smoother data points which I think we want.
// Required due to the way that different data arrives in different NMEA sentences.
var bufferOption = "J=1\n";
@ -186,6 +186,7 @@ GPSDProvider.prototype = {
// Go into "watcher" mode
var mode = "w\n";
this.outputStream.write(mode, mode.length);
} catch (e) { return; }
var dataListener = {
onStartRequest: function(request, context) {},

Просмотреть файл

@ -14,7 +14,7 @@ function nowInSeconds()
function LOG(aMsg) {
if (gLoggingEnabled)
{
aMsg = ("*** WIFI GEO: " + aMsg);
aMsg = "*** WIFI GEO: " + aMsg + "\n";
Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService).logStringMessage(aMsg);
dump(aMsg);
}
@ -227,25 +227,18 @@ WifiGeoPositionProvider.prototype = {
Ci.nsITimerCallback]),
prefService: null,
provider_url: null,
wifi_service: null,
timer: null,
protocol: null,
hasSeenWiFi: false,
started: false,
startup: function() {
LOG("startup called");
if (this.started == true)
return;
this.provider_url = this.prefService.getCharPref("geo.wifi.uri");
LOG("provider url = " + this.provider_url);
this.started = true;
try {
this.protocol = this.prefService.getIntPref("geo.wifi.protocol");
LOG("protocol = " + this.protocol);
} catch (e) {
this.protocol = 0;
}
LOG("startup called. testing mode is" + gTestingEnabled);
// if we don't see anything in 5 seconds, kick of one IP geo lookup.
// if we are testing, just hammer this callback so that we are more or less
// always sending data. It doesn't matter if we have an access point or not.
@ -284,6 +277,8 @@ WifiGeoPositionProvider.prototype = {
let prefBranch = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
if (prefBranch.getIntPref("network.cookie.lifetimePolicy") != 0)
prefBranch.deleteBranch("geo.wifi.access_token.");
this.started = false;
},
getAccessTokenForURL: function(url)
@ -308,7 +303,6 @@ WifiGeoPositionProvider.prototype = {
}
catch (e) {
accessToken = "";
LOG("Error: "+ e);
}
return accessToken;
},
@ -318,16 +312,22 @@ WifiGeoPositionProvider.prototype = {
LOG("onChange called");
this.hasSeenWiFi = true;
// Cache the preferred protocol for use inside the XHR callback
var protocol = this.protocol;
// send our request to a wifi geolocation network provider:
var xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
var xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Ci.nsIXMLHttpRequest);
// This is a background load
xhr.mozBackgroundRequest = true;
xhr.open("POST", this.provider_url, false);
var provider_url = this.prefService.getCharPref("geo.wifi.uri");
var provider_protocol = 0;
try {
provider_protocol = this.prefService.getIntPref("geo.wifi.protocol");
} catch (e) {}
LOG("provider url = " + provider_url);
xhr.open("POST", provider_url, false);
// set something so that we can strip cookies
xhr.channel.loadFlags = Ci.nsIChannel.LOAD_ANONYMOUS;
@ -340,9 +340,10 @@ WifiGeoPositionProvider.prototype = {
LOG("xhr onload...");
try {
// if we get a bad response, we will throw and never report a location
var response;
switch (protocol) {
switch (provider_protocol) {
case 1:
LOG("service returned: " + req.target.responseXML);
response = HELD.decode(req.target.responseXML);
@ -352,6 +353,10 @@ WifiGeoPositionProvider.prototype = {
LOG("service returned: " + req.target.responseText);
response = JSON.parse(req.target.responseText);
}
} catch (e) {
LOG("Parse failed");
return;
}
// response looks something like:
// {"location":{"latitude":51.5090332,"longitude":-0.1212726,"accuracy":150.0},"access_token":"2:jVhRZJ-j6PiRchH_:RGMrR0W1BiwdZs12"}
@ -393,7 +398,7 @@ WifiGeoPositionProvider.prototype = {
update.update(newLocation);
};
var accessToken = this.getAccessTokenForURL(this.provider_url);
var accessToken = this.getAccessTokenForURL(provider_url);
var request = {
version: "1.1.0",
@ -414,7 +419,7 @@ WifiGeoPositionProvider.prototype = {
}
var requestString;
switch (protocol) {
switch (provider_protocol) {
case 1:
requestString = HELD.encode(request);
break;
@ -434,9 +439,14 @@ WifiGeoPositionProvider.prototype = {
},
notify: function (timer) {
if (!gTestingEnabled) {
if (this.hasSeenWiFi == false)
this.onChange(null);
this.timer = null;
return;
}
// if we are testing, we need to hammer this.
this.onChange(null);
},
};

Просмотреть файл

@ -24,13 +24,11 @@ function error(error)
{
ok(0, "error occured trying to get geolocation from chrome");
SimpleTest.finish();
newwindow.close();
}
function done(position)
{
ok(position, "geolocation was found from chrome");
SimpleTest.finish();
newwindow.close();
}
</script>

Просмотреть файл

@ -45,31 +45,26 @@ include $(DEPTH)/config/autoconf.mk
include $(topsrcdir)/config/rules.mk
_TEST_FILES = \
test_manyCurrentSerial.html \
test_allowCurrent.html \
test_allowWatch.html \
test_cancelCurrent.html \
test_cancelWatch.html \
test_clearWatch.html \
test_clearWatch_invalid.html \
test_manyCurrentConcurrent.html \
test_garbageWatch.html \
test_manyCurrentSerial.html \
test_manyWatchConcurrent.html \
test_manyWatchSerial.html \
test_manyWindows.html \
test_allowCurrent.html \
test_allowWatch.html \
test_clearWatch.html \
test_clearWatch_invalid.html \
test_timeoutWatch.html \
test_windowClose.html \
windowTest.html \
geolocation_common.js \
geolocation.html \
test_optional_api_params.html \
test_windowClose.html \
test_timerRestartWatch.html \
geolocation.html \
geolocation_common.js \
network_geolocation.sjs \
windowTest.html \
$(NULL)
ifndef MOZ_PHOENIX
_TEST_FILES += test_cancelCurrent.html \
test_cancelWatch.html \
$(NULL)
endif
libs:: $(_TEST_FILES)
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)

Просмотреть файл

@ -1,10 +1,33 @@
function sleep(delay)
{
var start = Date.now();
while (Date.now() < start + delay);
}
function force_prompt(allow) {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
prefs.setBoolPref("geo.prompt.testing", true);
prefs.setBoolPref("geo.prompt.testing.allow", allow);
}
function reset_prompt() {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
prefs.setBoolPref("geo.prompt.testing", false);
prefs.setBoolPref("geo.prompt.testing.allow", false);
}
function start_sending_garbage()
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
prefs.setCharPref("geo.wifi.uri", "http://mochi.test:8888/tests/dom/tests/mochitest/geolocation/network_geolocation.sjs?action=respond-garbage");
// we need to be sure that all location data has been purged/set.
sleep(1000);
}
function stop_sending_garbage()
@ -12,6 +35,9 @@ function stop_sending_garbage()
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
prefs.setCharPref("geo.wifi.uri", "http://mochi.test:8888/tests/dom/tests/mochitest/geolocation/network_geolocation.sjs");
// we need to be sure that all location data has been purged/set.
sleep(1000);
}
function stop_geolocationProvider()
@ -19,6 +45,9 @@ function stop_geolocationProvider()
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
prefs.setCharPref("geo.wifi.uri", "http://mochi.test:8888/tests/dom/tests/mochitest/geolocation/network_geolocation.sjs?action=stop-responding");
// we need to be sure that all location data has been purged/set.
sleep(1000);
}
function resume_geolocationProvider()
@ -52,60 +81,4 @@ function check_geolocation(location) {
ok (location.coords.longitude == -122.08769, "lon matches known value");
ok(location.coords.altitude == 42, "alt matches known value");
ok(location.coords.altitudeAccuracy == 42, "alt acc matches known value");
}
function getChromeWindow()
{
const Ci = Components.interfaces;
var chromeWin = window.top
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow)
.QueryInterface(Ci.nsIDOMChromeWindow);
return chromeWin;
}
function getNotificationBox()
{
var chromeWin = getChromeWindow();
var notifyBox = chromeWin.getNotificationBox(window.top);
return notifyBox;
}
function clickNotificationButton(aButtonIndex) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
// First, check for new-style Firefox notifications
var chromeWin = getChromeWindow();
if (chromeWin.PopupNotifications) {
var panel = chromeWin.PopupNotifications.panel;
var notificationEl = panel.getElementsByAttribute("id", "geolocation-notification")[0];
if (aButtonIndex == kAcceptButton)
notificationEl.button.doCommand();
else if (aButtonIndex == kDenyButton)
throw "clickNotificationButton(kDenyButton) isn't supported in Firefox";
return;
}
// Otherwise, fall back to looking for a notificationbox
// This is a bit of a hack. The notification doesn't have an API to
// trigger buttons, so we dive down into the implementation and twiddle
// the buttons directly.
var box = getNotificationBox();
ok(box, "Got notification box");
var bar = box.getNotificationWithValue("geolocation");
ok(bar, "Got geolocation notification");
var button = bar.getElementsByTagName("button").item(aButtonIndex);
ok(button, "Got button");
button.doCommand();
}
const kAcceptButton = 0;
const kDenyButton = 1;

Просмотреть файл

@ -20,29 +20,17 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=478911
<pre id="test">
<script class="testbody" type="text/javascript">
var hasAccepted = false;
SimpleTest.waitForExplicitFinish();
resume_geolocationProvider();
force_prompt(true);
function successCallback(position) {
ok(hasAccepted, "Ensure that accept was pressed");
check_geolocation(position);
reset_prompt();
SimpleTest.finish();
}
function accept() {
hasAccepted = true;
clickNotificationButton(kAcceptButton);
}
SimpleTest.waitForExplicitFinish();
var options = {
maximumAge: 0,
};
// one-shot position requests
navigator.geolocation.getCurrentPosition(successCallback, null, options);
setTimeout(accept, 50);
navigator.geolocation.getCurrentPosition(successCallback);
</script>
</pre>

Просмотреть файл

@ -20,31 +20,21 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=478911
<pre id="test">
<script class="testbody" type="text/javascript">
SimpleTest.waitForExplicitFinish();
resume_geolocationProvider();
force_prompt(true);
var watchID;
var hasAccepted = false;
function successCallback(position) {
ok(hasAccepted, "Ensure that accept was pressed");
check_geolocation(position);
navigator.geolocation.clearWatch(watchID);
reset_prompt();
SimpleTest.finish();
}
function accept() {
hasAccepted = true;
clickNotificationButton(kAcceptButton);
}
/** Test for Bug **/
SimpleTest.waitForExplicitFinish();
watchID = navigator.geolocation.watchPosition(successCallback, null, null);
setTimeout(accept, 50);
</script>
</pre>
</body>

Просмотреть файл

@ -20,25 +20,24 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=478911
<pre id="test">
<script class="testbody" type="text/javascript">
SimpleTest.waitForExplicitFinish();
resume_geolocationProvider();
force_prompt(false);
function failureCallback(error) {
ok(error.code == error.PERMISSION_DENIED, "Ensure that the error was PERMISSION_DENIED");
reset_prompt();
SimpleTest.finish();
}
function successCallback(position){
ok(0, "Success was called when it shouldn't have been. major problem");
reset_prompt();
SimpleTest.finish();
}
/** Test for Bug **/
SimpleTest.waitForExplicitFinish();
navigator.geolocation.getCurrentPosition(successCallback, failureCallback, null);
// click deny
setTimeout(clickNotificationButton, 50, kDenyButton);
</script>
</pre>
</body>

Просмотреть файл

@ -20,27 +20,26 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=478911
<pre id="test">
<script class="testbody" type="text/javascript">
SimpleTest.waitForExplicitFinish();
resume_geolocationProvider();
force_prompt(false);
var watchID;
function failureCallback(error) {
ok(error.code == error.PERMISSION_DENIED, "Ensure that the error was PERMISSION_DENIED");
reset_prompt();
SimpleTest.finish();
}
function successCallback(position){
ok(0, "Success was called when it shouldn't have been. major problem");
reset_prompt();
SimpleTest.finish();
}
/** Test for Bug **/
SimpleTest.waitForExplicitFinish();
watchID = navigator.geolocation.watchPosition(successCallback, failureCallback, null);
// click deny
setTimeout(clickNotificationButton, 50, kDenyButton);
</script>
</pre>
</body>

Просмотреть файл

@ -20,8 +20,13 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=478911
<pre id="test">
<script class="testbody" type="text/javascript">
var watchID;
SimpleTest.waitForExplicitFinish();
resume_geolocationProvider();
force_prompt(true)
var hasBeenCleared = false;
var successWasCalledAfterClear = false;
function failureCallback(error)
{
ok(0, "we should not be seeing failures from this watchPosition");
@ -29,8 +34,7 @@ function failureCallback(error)
function successCallback(position) {
if (hasBeenCleared == true) {
// we should not be called here
ok(0, "successCallback was called after clear");
successWasCalledAfterClear = true;
}
}
@ -40,22 +44,17 @@ function clearWatch() {
}
function testAccepted() {
ok(!successWasCalledAfterClear, "The successCallback should not be called after clear");
reset_prompt();
SimpleTest.finish();
}
/** Test for Bug **/
SimpleTest.waitForExplicitFinish();
watchID = navigator.geolocation.watchPosition(successCallback, failureCallback, null);
setTimeout(clickNotificationButton, 10, kAcceptButton);
setTimeout(clearWatch, 250);
setTimeout(clearWatch, 50);
// wait for position changes
setTimeout(testAccepted, 1000);
setTimeout(testAccepted, 2000);
</script>
</pre>

Просмотреть файл

@ -19,8 +19,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=463039
<pre id="test">
<script class="testbody" type="text/javascript">
/** Test for Bug 463039 **/
// there are no watches, so this should always throw
for (x=-10; x<10; x++) {
navigator.geolocation.clearWatch(x);

Просмотреть файл

@ -22,18 +22,22 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=482260
/** Test for Bug **/
SimpleTest.waitForExplicitFinish();
resume_geolocationProvider();
force_prompt(true);
start_sending_garbage();
function successCallback(pos){
ok(false, "success should have never been called.");
stop_sending_garbage();
reset_prompt();
SimpleTest.finish();
}
function errorCallback(err) {
ok(err.code == err.TIMEOUT, "ensure error is a timeout.");
stop_sending_garbage();
reset_prompt();
SimpleTest.finish();
}
@ -47,8 +51,6 @@ navigator.geolocation.watchPosition(successCallback,
errorCallback,
options);
setTimeout(clickNotificationButton, 10, kAcceptButton);
</script>
</pre>
</body>

Просмотреть файл

@ -20,40 +20,25 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=482260
<pre id="test">
<script class="testbody" type="text/javascript">
var completeCount = 100;
var hasAccepted = false;
SimpleTest.waitForExplicitFinish();
resume_geolocationProvider();
force_prompt(true);
var successCallbackCalled = false;
function successCallback(position) {
check_geolocation(position);
successCallbackCalled = true;
}
function accept() {
hasAccepted = true;
clickNotificationButton(kAcceptButton);
}
for (var x = 0; x < 100; x++)
navigator.geolocation.getCurrentPosition(successCallback);
SimpleTest.waitForExplicitFinish();
// one-shot position requests
var options = {
maximumAge: 0,
};
var y = completeCount;
for (var x=0; x< y; x++)
navigator.geolocation.getCurrentPosition(successCallback, null, options);
setTimeout(accept, 50);
setTimeout(done, 1000);
function done() {
completeCount--;
ok(1, "Saw all successCallbacks");
function testPassed() {
ok(successCallbackCalled, "if nothing crashed, all okay");
reset_prompt();
SimpleTest.finish();
}
setTimeout(testPassed, 1000);
</script>
</pre>

Просмотреть файл

@ -20,33 +20,25 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=482260
<pre id="test">
<script class="testbody" type="text/javascript">
var completeCount = 1000;
SimpleTest.waitForExplicitFinish();
var hasAccepted = false;
resume_geolocationProvider();
force_prompt(true)
var keepGoing = 10;
function successCallback(position) {
check_geolocation(position);
completeCount--;
if (completeCount > 0)
navigator.geolocation.getCurrentPosition(successCallback, null, null);
if (keepGoing-- > 0) {
setTimeout(function() {navigator.geolocation.getCurrentPosition(successCallback);}, 0);
return;
}
ok(1, "100 successful calls");
reset_prompt();
SimpleTest.finish();
}
function accept() {
hasAccepted = true;
clickNotificationButton(kAcceptButton);
}
SimpleTest.waitForExplicitFinish();
var options = {
maximumAge: 0,
};
// one-shot position requests
navigator.geolocation.getCurrentPosition(successCallback, null, options);
setTimeout(accept, 50);
navigator.geolocation.getCurrentPosition(successCallback);
</script>
</pre>

Просмотреть файл

@ -20,40 +20,25 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=482260
<pre id="test">
<script class="testbody" type="text/javascript">
var completeCount = 100;
var hasAccepted = false;
SimpleTest.waitForExplicitFinish();
resume_geolocationProvider();
force_prompt(true);
var successCallbackCalled = false;
function successCallback(position) {
check_geolocation(position);
successCallbackCalled = true;
}
function accept() {
hasAccepted = true;
clickNotificationButton(kAcceptButton);
}
for (var x = 0; x < 100; x++)
navigator.geolocation.watchPosition(successCallback);
SimpleTest.waitForExplicitFinish();
// one-shot position requests
var options = {
maximumAge: 0,
};
var y = completeCount;
for (var x=0; x< y; x++)
navigator.geolocation.watchPosition(successCallback, null, options);
setTimeout(accept, 50);
setTimeout(done, 1000);
function done() {
completeCount--;
ok(1, "Saw all successCallbacks");
function testPassed() {
ok(successCallbackCalled, "if nothing crashed, all okay");
reset_prompt();
SimpleTest.finish();
}
setTimeout(testPassed, 1000);
</script>
</pre>

Просмотреть файл

@ -20,16 +20,15 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=482260
<pre id="test">
<script class="testbody" type="text/javascript">
var hasAccepted = false;
SimpleTest.waitForExplicitFinish();
resume_geolocationProvider();
force_prompt(true);
var watchID = 0;
var completeCount = 10;
var options = {
maximumAge: 0,
};
function successCallback(position) {
check_geolocation(position);
navigator.geolocation.clearWatch(watchID);
@ -37,23 +36,15 @@ function successCallback(position) {
if (completeCount==0) {
ok(1, "all watchPosition successCallbacks called");
reset_prompt();
SimpleTest.finish();
} else {
watchID = navigator.geolocation.watchPosition(successCallback, null, options);
setTimeout(accept, 50);
}
return;
}
function accept() {
hasAccepted = true;
clickNotificationButton(kAcceptButton);
watchID = navigator.geolocation.watchPosition(successCallback);
}
SimpleTest.waitForExplicitFinish();
// one-shot position requests
watchID = navigator.geolocation.watchPosition(successCallback, null, options);
setTimeout(accept, 50);
watchID = navigator.geolocation.watchPosition(successCallback);
</script>
</pre>

Просмотреть файл

@ -21,6 +21,10 @@ href="https://bugzilla.mozilla.org/show_bug.cgi?id=478911">Crash in Multiple Win
<pre id="test">
<script class="testbody" type="text/javascript">
// ensure we are using the right testing provider
resume_geolocationProvider();
force_prompt(true);
/** Test for Bug **/
var numberOfWindows = 5; // 20 seems to be the default max popups during the mochitest run
@ -48,6 +52,7 @@ function checkDone()
{
ok(navigator.geolocation, "Opened a bunch of windows and didn't crash.");
clearInterval(timer);
reset_prompt();
SimpleTest.finish();
}
}

Просмотреть файл

@ -19,6 +19,10 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=452566
<pre id="test">
<script class="testbody" type="text/javascript">
// ensure we are using the right testing provider
resume_geolocationProvider();
force_prompt(true)
/** Test for Bug 452566 **/
const NOT_ENOUGH_ARGS = 2153185281;
@ -105,9 +109,8 @@ try {
}
ok(!exception, exception);
// Successful calls trigger a geolocation notification,
// so clean up ready for the next test.
clickNotificationButton(kAcceptButton);
reset_prompt();
</script>
</pre>

Просмотреть файл

@ -21,6 +21,10 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=455327
<script class="testbody" type="text/javascript">
/** Test for Bug **/
// ensure we are using the right testing provider
resume_geolocationProvider();
force_prompt(true);
SimpleTest.waitForExplicitFinish();
stop_geolocationProvider();
@ -28,6 +32,7 @@ stop_geolocationProvider();
function successCallback(pos){
ok(false, "success should have never been called.");
resume_geolocationProvider();
reset_prompt()
SimpleTest.finish();
}
@ -37,6 +42,7 @@ function errorCallback(err) {
else
ok(err.code == err.TIMEOUT, "ensure error is a timeout.");
resume_geolocationProvider();
reset_prompt()
SimpleTest.finish();
}
@ -49,9 +55,6 @@ var options = {
navigator.geolocation.watchPosition(successCallback,
errorCallback,
options);
setTimeout(clickNotificationButton, 10, kAcceptButton);
</script>
</pre>
</body>

Просмотреть файл

@ -0,0 +1,55 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=526326
-->
<head>
<title>Test for watchPosition </title>
<script type="text/javascript" src="/MochiKit/packed.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="geolocation_common.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=526326">Mozilla Bug 526326</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
SimpleTest.waitForExplicitFinish();
// ensure we are using the right testing provider
resume_geolocationProvider();
force_prompt(true);
var watchID;
function errorCallback(err) {
ok(err.code == err.TIMEOUT, "ensure error is a timeout.");
resume_geolocationProvider();
reset_prompt();
SimpleTest.finish();
}
function successCallback(position) {
// Now that we got a success callback, lets try to ensure
// that we get a timeout error.
stop_geolocationProvider();
}
var options = {
maximumAge: 0,
timeout: 1000
};
watchID = navigator.geolocation.watchPosition(successCallback, errorCallback, options);
</script>
</pre>
</body>
</html>

Просмотреть файл

@ -21,10 +21,13 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=493615
<script class="testbody" type="text/javascript">
function done() {
ok(1, "no crash, so pass.");
SimpleTest.finish();
reset_prompt();
}
SimpleTest.waitForExplicitFinish();
force_prompt(true);
window.open("windowTest.html");

Просмотреть файл

@ -26,13 +26,7 @@ function successCallback(position) {
opener.done();
}
function accept() {
clickNotificationButton(kAcceptButton);
}
navigator.geolocation.watchPosition(successCallback, null, null);
setTimeout(accept, 50);
</script>
</pre>
</body>