michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: MARIONETTE_TIMEOUT = 10000; michael@0: michael@0: SpecialPowers.addPermission("fmradio", true, document); michael@0: michael@0: let FMRadio = window.navigator.mozFMRadio; michael@0: michael@0: function verifyInitialState() { michael@0: log("Verifying initial state."); michael@0: ok(FMRadio); michael@0: is(FMRadio.enabled, false); michael@0: michael@0: log("Verifying attributes when disabled."); michael@0: is(FMRadio.frequency, null); michael@0: ok(FMRadio.frequencyLowerBound); michael@0: ok(FMRadio.frequencyUpperBound); michael@0: ok(FMRadio.frequencyUpperBound > FMRadio.frequencyLowerBound); michael@0: ok(FMRadio.channelWidth); michael@0: michael@0: enableFMRadio(); michael@0: } michael@0: michael@0: function enableFMRadio() { michael@0: log("Verifying behaviors when enabled."); michael@0: var frequency = FMRadio.frequencyLowerBound + FMRadio.channelWidth; michael@0: var request = FMRadio.enable(frequency); michael@0: ok(request, "FMRadio.enable(r" + frequency + ") returns request"); michael@0: michael@0: request.onsuccess = function() { michael@0: ok(FMRadio.enabled); michael@0: ok(typeof FMRadio.frequency == "number"); michael@0: ok(FMRadio.frequency > FMRadio.frequencyLowerBound); michael@0: }; michael@0: michael@0: request.onerror = function() { michael@0: ok(null, "Failed to enable"); michael@0: }; michael@0: michael@0: var enabled = false; michael@0: FMRadio.onenabled = function() { michael@0: FMRadio.onenabled = null; michael@0: enabled = FMRadio.enabled; michael@0: }; michael@0: michael@0: FMRadio.onfrequencychange = function() { michael@0: log("Check if 'onfrequencychange' event is fired after the 'enabled' event"); michael@0: FMRadio.onfrequencychange = null; michael@0: ok(enabled, "FMRadio is enabled when handling `onfrequencychange`"); michael@0: disableFMRadio(); michael@0: }; michael@0: } michael@0: michael@0: function disableFMRadio() { michael@0: log("Verify behaviors when disabled"); michael@0: michael@0: // There are two possibilities which depends on the system michael@0: // process scheduling (bug 911063 comment 0): michael@0: // - seek fails michael@0: // - seek's onsuccess fires before disable's onsucess michael@0: var seekRequest = FMRadio.seekUp(); michael@0: var seekCompletes = false; michael@0: var failedToSeek = false; michael@0: seekRequest.onerror = function() { michael@0: ok(!seekCompletes); michael@0: failedToSeek = true; michael@0: }; michael@0: michael@0: seekRequest.onsuccess = function() { michael@0: ok(!failedToSeek); michael@0: seekCompletes = true; michael@0: }; michael@0: michael@0: FMRadio.disable(); michael@0: FMRadio.ondisabled = function() { michael@0: FMRadio.ondisabled = null; michael@0: ok(seekCompletes || failedToSeek); michael@0: ok(!FMRadio.enabled); michael@0: finish(); michael@0: }; michael@0: } michael@0: michael@0: verifyInitialState(); michael@0: