Bug 1044736 - Part 5. Extract tests functions to file_test_widget.js. r=fabrice
authorKan-Ru Chen (陳侃如) <kanru@kanru.info>
Wed, 12 Nov 2014 19:27:32 +0800
changeset 215151 61fc517d0336ad0ce36db3beab213f7c3a7201b0
parent 215150 59a47fafaccfe5fb04cc88fd75a4edf9691f9fa1
child 215152 b1a6ecfca67465ee773cd85ad99749a1a0727bd6
push id12091
push userkchen@mozilla.com
push dateWed, 12 Nov 2014 11:27:55 +0000
treeherderb2g-inbound@b1a6ecfca674 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersfabrice
bugs1044736
milestone36.0a1
Bug 1044736 - Part 5. Extract tests functions to file_test_widget.js. r=fabrice
dom/apps/tests/file_test_widget.js
dom/apps/tests/mochitest.ini
dom/apps/tests/test_widget.html
new file mode 100644
--- /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();
+}
--- a/dom/apps/tests/mochitest.ini
+++ b/dom/apps/tests/mochitest.ini
@@ -12,16 +12,17 @@ support-files =
   file_manifest.json^headers^
   file_trusted_app.template.webapp
   file_invalidWidget_app.template.webapp
   file_packaged_app.sjs
   file_packaged_app.template.html
   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/*
   test_packaged_app_common.js
   marketplace/*
   pkg_install_iframe.html
 
 [test_app_enabled.html]
--- a/dom/apps/tests/test_widget.html
+++ b/dom/apps/tests/test_widget.html
@@ -1,235 +1,17 @@
 <!DOCTYPE HTML>
 <html>
 <head>
   <meta charset="utf-8">
   <title>Test for DataStore - basic operation on a readonly db</title>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="file_test_widget.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
 </head>
 <body>
 <div id="container"></div>
   <script type="application/javascript;version=1.7">
-
-  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();
-  }
-
   SimpleTest.waitForExplicitFinish();
   runTest();
   </script>
 </body>
 </html>