diff --git a/dom/apps/tests/file_test_widget.js b/dom/apps/tests/file_test_widget.js new file mode 100644 index 00000000000..a0a600bbad9 --- /dev/null +++ b/dom/apps/tests/file_test_widget.js @@ -0,0 +1,217 @@ +var gWidgetManifestURL = 'http://test/tests/dom/apps/tests/file_app.sjs?apptype=widget&getmanifest=true'; +var gInvalidWidgetManifestURL = 'http://test/tests/dom/apps/tests/file_app.sjs?apptype=invalidWidget&getmanifest=true'; +var gApp; + +function onError() { + ok(false, "Error callback invoked"); + finish(); +} + +function installApp(path) { + var request = navigator.mozApps.install(path); + request.onerror = onError; + request.onsuccess = function() { + gApp = request.result; + + runTest(); + } +} + +function uninstallApp() { + // Uninstall the app. + var request = navigator.mozApps.mgmt.uninstall(gApp); + request.onerror = onError; + request.onsuccess = function() { + // All done. + info("All done"); + + runTest(); + } +} + +function testApp(isValidWidget) { + info("Test widget feature. IsValidWidget: " + isValidWidget); + + var ifr = document.createElement('iframe'); + ifr.setAttribute('mozbrowser', 'true'); + ifr.setAttribute('mozwidget', gApp.manifestURL); + ifr.setAttribute('src', gApp.origin+gApp.manifest.launch_path); + + var domParent = document.getElementById('container'); + domParent.appendChild(ifr); + + var mm = SpecialPowers.getBrowserFrameMessageManager(ifr); + mm.addMessageListener('OK', function(msg) { + ok(isValidWidget, "Message from widget: " + SpecialPowers.wrap(msg).json); + }); + mm.addMessageListener('KO', function(msg) { + ok(!isValidWidget, "Message from widget: " + SpecialPowers.wrap(msg).json); + }); + mm.addMessageListener('DONE', function(msg) { + ok(true, "Message from widget complete: "+SpecialPowers.wrap(msg).json); + domParent.removeChild(ifr); + runTest(); + }); + + ifr.addEventListener('mozbrowserloadend', function() { + ok(true, "receive mozbrowserloadend"); + + // Test limited browser API feature only for valid widget case + if (isValidWidget) { + testLimitedBrowserAPI(ifr); + } + SimpleTest.executeSoon(()=>loadFrameScript(mm)); + }, false); + + // Test limited browser API feature only for valid widget case + if (!isValidWidget) { + return; + } + + [ + 'mozbrowsertitlechange', + 'mozbrowseropenwindow', + 'mozbrowserscroll', + 'mozbrowserasyncscroll' + ].forEach( function(topic) { + ifr.addEventListener(topic, function() { + ok(false, topic + " should be hidden"); + }, false); + }); +} + +function testLimitedBrowserAPI(ifr) { + var securitySensitiveCalls = [ + 'sendMouseEvent', + 'sendTouchEvent', + 'goBack', + 'goForward', + 'reload', + 'stop', + 'download', + 'purgeHistory', + 'getScreenshot', + 'zoom', + 'getCanGoBack', + 'getCanGoForward' + ]; + securitySensitiveCalls.forEach( function(call) { + is(typeof ifr[call], "undefined", call + " should be hidden for widget"); + }); +} + +function loadFrameScript(mm) { + var script = 'data:,\ + function ok(p, msg) { \ + if (p) { \ + sendAsyncMessage("OK", msg); \ +} else { \ + sendAsyncMessage("KO", msg); \ +} \ +} \ + \ + function is(a, b, msg) { \ + if (a == b) { \ + sendAsyncMessage("OK", a + " == " + b + " - " + msg); \ +} else { \ + sendAsyncMessage("KO", a + " != " + b + " - " + msg); \ +} \ +} \ + \ + function finish() { \ + sendAsyncMessage("DONE",""); \ +} \ + \ + function onError() { \ + ok(false, "Error callback invoked"); \ + finish(); \ +} \ + \ + function checkWidget(widget) { \ + /*For invalid widget case, ignore the following check*/\ + if (widget) { \ + var widgetName = "Really Rapid Release (APPTYPETOKEN)"; \ + is(widget.origin, "http://test", "Widget origin should be correct"); \ + is(widget.installOrigin, "http://mochi.test:8888", "Install origin should be correct"); \ +} \ + finish(); \ +} \ + \ + var request = content.window.navigator.mozApps.getSelf(); \ + request.onsuccess = function() { \ + var widget = request.result; \ + ok(widget,"Should be a widget"); \ + checkWidget(widget); \ +}; \ + request.onerror = onError; \ + content.window.open("about:blank"); /*test mozbrowseropenwindow*/ \ + content.window.scrollTo(4000, 4000); /*test mozbrowser(async)scroll*/ \ + '; + mm.loadFrameScript(script, /* allowDelayedLoad = */ false); +} + +var tests = [ + // Permissions + function() { + SpecialPowers.pushPermissions( + [{ "type": "browser", "allow": 1, "context": document }, + { "type": "embed-widgets", "allow": 1, "context": document }, + { "type": "webapps-manage", "allow": 1, "context": document }], runTest); + }, + + // Preferences + function() { + SpecialPowers.pushPrefEnv({"set": [["dom.mozBrowserFramesEnabled", true], + ["dom.enable_widgets", true], + ["dom.datastore.sysMsgOnChangeShortTimeoutSec", 1], + ["dom.datastore.sysMsgOnChangeLongTimeoutSec", 3]]}, runTest); + }, + + function() { + if (SpecialPowers.isMainProcess()) { + SpecialPowers.Cu.import("resource://gre/modules/DataStoreChangeNotifier.jsm"); + } + + SpecialPowers.setAllAppsLaunchable(true); + runTest(); + }, + + // No confirmation needed when an app is installed + function() { + SpecialPowers.autoConfirmAppInstall(() => { + SpecialPowers.autoConfirmAppUninstall(runTest); + }); + }, + + // Installing the app + ()=>installApp(gWidgetManifestURL), + + // Run tests in app + ()=>testApp(true), + + // Uninstall the app + uninstallApp, + + // Installing the app for invalid widget case + ()=>installApp(gInvalidWidgetManifestURL), + + // Run tests in app for invalid widget case + ()=>testApp(false), + + // Uninstall the app + uninstallApp +]; + +function runTest() { + if (!tests.length) { + finish(); + return; + } + + var test = tests.shift(); + test(); +} + +function finish() { + SimpleTest.finish(); +} diff --git a/dom/apps/tests/mochitest.ini b/dom/apps/tests/mochitest.ini index d6b6a296ec7..09bedc01ae8 100644 --- a/dom/apps/tests/mochitest.ini +++ b/dom/apps/tests/mochitest.ini @@ -17,6 +17,7 @@ support-files = file_packaged_app.template.webapp file_widget_app.template.webapp file_widget_app.template.html + file_test_widget.js signed_app.sjs signed_app_template.webapp signed/* diff --git a/dom/apps/tests/test_widget.html b/dom/apps/tests/test_widget.html index 6b702ae9e39..cd4a2271b5a 100644 --- a/dom/apps/tests/test_widget.html +++ b/dom/apps/tests/test_widget.html @@ -4,230 +4,12 @@ Test for DataStore - basic operation on a readonly db +