Bug 1260548: Part 7 - Add mochitests for the Android tabs API. r?aswan draft
authorKris Maglione <maglione.k@gmail.com>
Sun, 29 Jan 2017 00:58:07 -0800
changeset 467791 00652a6cf510512e9d64943916f11677ac1d3917
parent 467790 6b324b135a70b8cc53bab9ccd74d4acafe4714d4
child 467792 0341862fceef458479ef113dcc3e77c48835b56f
push id43274
push usermaglione.k@gmail.com
push dateSun, 29 Jan 2017 20:10:11 +0000
reviewersaswan
bugs1260548
milestone54.0a1
Bug 1260548: Part 7 - Add mochitests for the Android tabs API. r?aswan MozReview-Commit-ID: DndSw3di4Jw
mobile/android/components/extensions/test/mochitest/context.html
mobile/android/components/extensions/test/mochitest/context_tabs_onUpdated_iframe.html
mobile/android/components/extensions/test/mochitest/context_tabs_onUpdated_page.html
mobile/android/components/extensions/test/mochitest/file_bypass_cache.sjs
mobile/android/components/extensions/test/mochitest/file_dummy.html
mobile/android/components/extensions/test/mochitest/file_iframe_document.html
mobile/android/components/extensions/test/mochitest/file_iframe_document.sjs
mobile/android/components/extensions/test/mochitest/mochitest.ini
mobile/android/components/extensions/test/mochitest/test_ext_tab_runtimeConnect.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_captureVisibleTab.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_create.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_events.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript_bad.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript_good.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript_no_create.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript_runAt.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_getCurrent.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_insertCSS.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_onUpdated.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_reload.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_reload_bypass_cache.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_sendMessage.html
mobile/android/components/extensions/test/mochitest/test_ext_tabs_update_url.html
copy from browser/components/extensions/test/browser/context.html
copy to mobile/android/components/extensions/test/mochitest/context.html
copy from browser/components/extensions/test/browser/context_tabs_onUpdated_iframe.html
copy to mobile/android/components/extensions/test/mochitest/context_tabs_onUpdated_iframe.html
copy from browser/components/extensions/test/browser/context_tabs_onUpdated_page.html
copy to mobile/android/components/extensions/test/mochitest/context_tabs_onUpdated_page.html
copy from browser/components/extensions/test/browser/file_bypass_cache.sjs
copy to mobile/android/components/extensions/test/mochitest/file_bypass_cache.sjs
copy from browser/components/extensions/test/browser/file_dummy.html
copy to mobile/android/components/extensions/test/mochitest/file_dummy.html
copy from browser/components/extensions/test/browser/file_iframe_document.html
copy to mobile/android/components/extensions/test/mochitest/file_iframe_document.html
copy from browser/components/extensions/test/browser/file_iframe_document.sjs
copy to mobile/android/components/extensions/test/mochitest/file_iframe_document.sjs
--- a/mobile/android/components/extensions/test/mochitest/mochitest.ini
+++ b/mobile/android/components/extensions/test/mochitest/mochitest.ini
@@ -1,6 +1,29 @@
 [DEFAULT]
 support-files =
   ../../../../../../toolkit/components/extensions/test/mochitest/test_ext_all_apis.js
+  context.html
+  context_tabs_onUpdated_iframe.html
+  context_tabs_onUpdated_page.html
+  file_bypass_cache.sjs
+  file_dummy.html
+  file_iframe_document.html
+  file_iframe_document.sjs
 tags = webextensions
 
 [test_ext_all_apis.html]
+[test_ext_tab_runtimeConnect.html]
+[test_ext_tabs_captureVisibleTab.html]
+[test_ext_tabs_create.html]
+[test_ext_tabs_events.html]
+[test_ext_tabs_executeScript.html]
+[test_ext_tabs_executeScript_bad.html]
+[test_ext_tabs_executeScript_good.html]
+[test_ext_tabs_executeScript_no_create.html]
+[test_ext_tabs_executeScript_runAt.html]
+[test_ext_tabs_getCurrent.html]
+[test_ext_tabs_insertCSS.html]
+[test_ext_tabs_reload.html]
+[test_ext_tabs_reload_bypass_cache.html]
+[test_ext_tabs_onUpdated.html]
+[test_ext_tabs_sendMessage.html]
+[test_ext_tabs_update_url.html]
copy from browser/components/extensions/test/browser/browser_ext_tab_runtimeConnect.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tab_runtimeConnect.html
--- a/browser/components/extensions/test/browser/browser_ext_tab_runtimeConnect.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tab_runtimeConnect.html
@@ -1,14 +1,25 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs runtimeConnect Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 add_task(function* () {
-  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "http://mochi.test:8888/");
+  let win = window.open("http://mochi.test:8888/");
 
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["tabs"],
     },
 
     background: function() {
       let messages_received = [];
@@ -51,24 +62,28 @@ add_task(function* () {
         });
       },
       "tab.html": `
         <!DOCTYPE html>
         <html>
           <head>
             <title>test tab extension page</title>
             <meta charset="utf-8">
-            <script src="tab.js" async></script>
+            <script src="tab.js" async><\/script>
           </head>
           <body>
             <h1>test tab extension page</h1>
           </body>
         </html>
       `,
     },
   });
 
   yield extension.startup();
   yield extension.awaitFinish("tabRuntimeConnect.pass");
   yield extension.unload();
 
-  yield BrowserTestUtils.removeTab(tab);
+  win.close();
 });
+</script>
+
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_captureVisibleTab.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_captureVisibleTab.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_captureVisibleTab.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_captureVisibleTab.html
@@ -1,10 +1,21 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs captureVisibleTab Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 function* runTest(options) {
   options.neutral = [0xaa, 0xaa, 0xaa];
 
   let html = `
     <!DOCTYPE html>
     <html lang="en">
@@ -17,19 +28,17 @@ function* runTest(options) {
                   top: 2px;
                   bottom: 2px;
                   background: rgb(${options.neutral});"></div>
     </body>
     </html>
   `;
 
   let url = `data:text/html,${encodeURIComponent(html)}`;
-  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, url, true);
-
-  tab.linkedBrowser.fullZoom = options.fullZoom;
+  let win = window.open(url);
 
   async function background(options) {
     browser.test.log(`Test color ${options.color} at fullZoom=${options.fullZoom}`);
 
     try {
       let [tab] = await browser.tabs.query({currentWindow: true, active: true});
 
       let [jpeg, png, ...pngs] = await Promise.all([
@@ -116,27 +125,23 @@ function* runTest(options) {
   });
 
   yield extension.startup();
 
   yield extension.awaitFinish("captureVisibleTab");
 
   yield extension.unload();
 
-  yield BrowserTestUtils.removeTab(tab);
+  win.close();
 }
 
 add_task(function* testCaptureVisibleTab() {
-  yield runTest({color: [0, 0, 0], fullZoom: 1});
-
-  yield runTest({color: [0, 0, 0], fullZoom: 2});
+  yield runTest({color: [0, 0, 0]});
 
-  yield runTest({color: [0, 0, 0], fullZoom: 0.5});
-
-  yield runTest({color: [255, 255, 255], fullZoom: 1});
+  yield runTest({color: [255, 255, 255]});
 });
 
 add_task(function* testCaptureVisibleTabPermissions() {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["tabs"],
     },
 
@@ -148,8 +153,12 @@ add_task(function* testCaptureVisibleTab
   });
 
   yield extension.startup();
 
   yield extension.awaitFinish("captureVisibleTabPermissions");
 
   yield extension.unload();
 });
+</script>
+
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_create.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_create.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_create.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_create.html
@@ -1,98 +1,72 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs create Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 add_task(function* () {
-  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "about:robots");
-  gBrowser.selectedTab = tab;
-
-  // TODO: Multiple windows.
-
-  // Using pre-loaded new tab pages interferes with onUpdated events.
-  // It probably shouldn't.
-  SpecialPowers.setBoolPref("browser.newtab.preload", false);
-  registerCleanupFunction(() => {
-    SpecialPowers.clearUserPref("browser.newtab.preload");
-  });
+  let win = window.open("http://example.org/");
 
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["tabs"],
 
       "background": {"page": "bg/background.html"},
     },
 
     files: {
       "bg/blank.html": `<html><head><meta charset="utf-8"></head></html>`,
 
       "bg/background.html": `<html><head>
         <meta charset="utf-8">
-        <script src="background.js"></script>
+        <script src="background.js"><\/script>
       </head></html>`,
 
       "bg/background.js": function() {
         let activeTab;
         let activeWindow;
 
         function runTests() {
           const DEFAULTS = {
-            index: 2,
             windowId: activeWindow,
             active: true,
-            pinned: false,
-            url: "about:newtab",
+            url: "about:blank",
           };
 
           let tests = [
             {
               create: {url: "http://example.com/"},
               result: {url: "http://example.com/"},
             },
             {
               create: {url: "blank.html"},
               result: {url: browser.runtime.getURL("bg/blank.html")},
             },
             {
               create: {},
-              result: {url: "about:newtab"},
             },
             {
               create: {active: false},
               result: {active: false},
             },
             {
               create: {active: true},
               result: {active: true},
             },
-            {
-              create: {pinned: true},
-              result: {pinned: true, index: 0},
-            },
-            {
-              create: {pinned: true, active: true},
-              result: {pinned: true, active: true, index: 0},
-            },
-            {
-              create: {pinned: true, active: false},
-              result: {pinned: true, active: false, index: 0},
-            },
-            {
-              create: {index: 1},
-              result: {index: 1},
-            },
-            {
-              create: {index: 1, active: false},
-              result: {index: 1, active: false},
-            },
-            {
-              create: {windowId: activeWindow},
-              result: {windowId: activeWindow},
-            },
           ];
 
           async function nextTest() {
             if (!tests.length) {
               browser.test.notifyPass("tabs.create");
               return;
             }
 
@@ -156,11 +130,14 @@ add_task(function* () {
       },
     },
   });
 
   yield extension.startup();
   yield extension.awaitFinish("tabs.create");
   yield extension.unload();
 
-  yield BrowserTestUtils.removeTab(tab);
+  win.close();
 });
+</script>
 
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_events.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_events.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_events.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_events.html
@@ -1,10 +1,21 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs Events Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 add_task(function* testTabEvents() {
   async function background() {
     let events = [];
     let eventPromise;
     let checkEvents = () => {
       if (eventPromise && events.length >= eventPromise.names.length) {
@@ -49,112 +60,34 @@ add_task(function* testTabEvents() {
       for (let [i, name] of names.entries()) {
         browser.test.assertEq(name, i in events && events[i].type,
                               `Got expected ${name} event`);
       }
       return events.splice(0);
     }
 
     try {
-      browser.test.log("Create second browser window");
-
-      let windows = await Promise.all([
-        browser.windows.getCurrent(),
-        browser.windows.create({url: "about:blank"}),
-      ]);
-
-      let windowId = windows[0].id;
-      let otherWindowId = windows[1].id;
-
-      let [created] = await expectEvents(["onCreated"]);
-      let initialTab = created.tab;
-
-
-      browser.test.log("Create tab in window 1");
-      let tab = await browser.tabs.create({windowId, index: 0, url: "about:blank"});
+      browser.test.log("Create tab");
+      let tab = await browser.tabs.create({url: "about:blank"});
       let oldIndex = tab.index;
-      browser.test.assertEq(0, oldIndex, "Tab has the expected index");
 
       [created] = await expectEvents(["onCreated"]);
       browser.test.assertEq(tab.id, created.tab.id, "Got expected tab ID");
       browser.test.assertEq(oldIndex, created.tab.index, "Got expected tab index");
 
 
-      browser.test.log("Move tab to window 2");
-      await browser.tabs.move([tab.id], {windowId: otherWindowId, index: 0});
-
-      let [detached, attached] = await expectEvents(["onDetached", "onAttached"]);
-      browser.test.assertEq(oldIndex, detached.oldPosition, "Expected old index");
-      browser.test.assertEq(windowId, detached.oldWindowId, "Expected old window ID");
-
-      browser.test.assertEq(0, attached.newPosition, "Expected new index");
-      browser.test.assertEq(otherWindowId, attached.newWindowId, "Expected new window ID");
-
-
-      browser.test.log("Move tab within the same window");
-      let [moved] = await browser.tabs.move([tab.id], {index: 1});
-      browser.test.assertEq(1, moved.index, "Expected new index");
-
-      [moved] = await expectEvents(["onMoved"]);
-      browser.test.assertEq(tab.id, moved.tabId, "Expected tab ID");
-      browser.test.assertEq(0, moved.fromIndex, "Expected old index");
-      browser.test.assertEq(1, moved.toIndex, "Expected new index");
-      browser.test.assertEq(otherWindowId, moved.windowId, "Expected window ID");
-
-
       browser.test.log("Remove tab");
       await browser.tabs.remove(tab.id);
       let [removed] = await expectEvents(["onRemoved"]);
 
       browser.test.assertEq(tab.id, removed.tabId, "Expected removed tab ID");
-      browser.test.assertEq(otherWindowId, removed.windowId, "Expected removed tab window ID");
+      browser.test.assertEq(tab.windowId, removed.windowId, "Expected removed tab window ID");
       // Note: We want to test for the actual boolean value false here.
       browser.test.assertEq(false, removed.isWindowClosing, "Expected isWindowClosing value");
 
-
-      browser.test.log("Close second window");
-      await browser.windows.remove(otherWindowId);
-      [removed] = await expectEvents(["onRemoved"]);
-      browser.test.assertEq(initialTab.id, removed.tabId, "Expected removed tab ID");
-      browser.test.assertEq(otherWindowId, removed.windowId, "Expected removed tab window ID");
-      browser.test.assertEq(true, removed.isWindowClosing, "Expected isWindowClosing value");
-
-
-      browser.test.log("Create additional tab in window 1");
-      tab = await browser.tabs.create({windowId, url: "about:blank"});
-      await expectEvents(["onCreated"]);
-
-
-      browser.test.log("Create a new window, adopting the new tab");
-      // We have to explicitly wait for the event here, since its timing is
-      // not predictable.
-      let promiseAttached = new Promise(resolve => {
-        browser.tabs.onAttached.addListener(function listener(tabId) {
-          browser.tabs.onAttached.removeListener(listener);
-          resolve();
-        });
-      });
-
-      let [window] = await Promise.all([
-        browser.windows.create({tabId: tab.id}),
-        promiseAttached,
-      ]);
-
-      [detached, attached] = await expectEvents(["onDetached", "onAttached"]);
-
-      browser.test.assertEq(tab.id, detached.tabId, "Expected onDetached tab ID");
-
-      browser.test.assertEq(tab.id, attached.tabId, "Expected onAttached tab ID");
-      browser.test.assertEq(0, attached.newPosition, "Expected onAttached new index");
-      browser.test.assertEq(window.id, attached.newWindowId,
-                            "Expected onAttached new window id");
-
-      browser.test.log("Close the new window");
-      await browser.windows.remove(window.id);
-
       browser.test.notifyPass("tabs-events");
     } catch (e) {
       browser.test.fail(`${e} :: ${e.stack}`);
       browser.test.notifyFail("tabs-events");
     }
   }
 
   let extension = ExtensionTestUtils.loadExtension({
@@ -165,92 +98,16 @@ add_task(function* testTabEvents() {
     background,
   });
 
   yield extension.startup();
   yield extension.awaitFinish("tabs-events");
   yield extension.unload();
 });
 
-add_task(function* testTabEventsSize() {
-  function background() {
-    function sendSizeMessages(tab, type) {
-      browser.test.sendMessage(`${type}-dims`, {width: tab.width, height: tab.height});
-    }
-
-    browser.tabs.onCreated.addListener(tab => {
-      sendSizeMessages(tab, "on-created");
-    });
-
-    browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
-      if (changeInfo.status == "complete") {
-        sendSizeMessages(tab, "on-updated");
-      }
-    });
-
-    browser.test.onMessage.addListener(async (msg, arg) => {
-      if (msg === "create-tab") {
-        let tab = await browser.tabs.create({url: "http://example.com/"});
-        sendSizeMessages(tab, "create");
-        browser.test.sendMessage("created-tab-id", tab.id);
-      } else if (msg === "update-tab") {
-        let tab = await browser.tabs.update(arg, {url: "http://example.org/"});
-        sendSizeMessages(tab, "update");
-      } else if (msg === "remove-tab") {
-        browser.tabs.remove(arg);
-        browser.test.sendMessage("tab-removed");
-      }
-    });
-
-    browser.test.sendMessage("ready");
-  }
-
-  let extension = ExtensionTestUtils.loadExtension({
-    manifest: {
-      "permissions": ["tabs"],
-    },
-    background,
-  });
-
-  const RESOLUTION_PREF = "layout.css.devPixelsPerPx";
-  registerCleanupFunction(() => {
-    SpecialPowers.clearUserPref(RESOLUTION_PREF);
-  });
-
-  function checkDimensions(dims, type) {
-    is(dims.width, gBrowser.selectedBrowser.clientWidth, `tab from ${type} reports expected width`);
-    is(dims.height, gBrowser.selectedBrowser.clientHeight, `tab from ${type} reports expected height`);
-  }
-
-  yield Promise.all([extension.startup(), extension.awaitMessage("ready")]);
-
-  for (let resolution of [2, 1]) {
-    SpecialPowers.setCharPref(RESOLUTION_PREF, String(resolution));
-    is(window.devicePixelRatio, resolution, "window has the required resolution");
-
-    extension.sendMessage("create-tab");
-    let tabId = yield extension.awaitMessage("created-tab-id");
-
-    checkDimensions(yield extension.awaitMessage("create-dims"), "create");
-    checkDimensions(yield extension.awaitMessage("on-created-dims"), "onCreated");
-    checkDimensions(yield extension.awaitMessage("on-updated-dims"), "onUpdated");
-
-    extension.sendMessage("update-tab", tabId);
-
-    checkDimensions(yield extension.awaitMessage("update-dims"), "update");
-    checkDimensions(yield extension.awaitMessage("on-updated-dims"), "onUpdated");
-
-    extension.sendMessage("remove-tab", tabId);
-    yield extension.awaitMessage("tab-removed");
-  }
-
-  yield extension.unload();
-  SpecialPowers.clearUserPref(RESOLUTION_PREF);
-});
-
 add_task(function* testTabRemovalEvent() {
   async function background() {
     function awaitLoad(tabId) {
       return new Promise(resolve => {
         browser.tabs.onUpdated.addListener(function listener(tabId_, changed, tab) {
           if (tabId == tabId_ && changed.status == "complete") {
             browser.tabs.onUpdated.removeListener(listener);
             resolve();
@@ -265,17 +122,17 @@ add_task(function* testTabRemovalEvent()
         for (let tab of tabs) {
           browser.test.assertTrue(tab.id != tabId, "Tab query should not include removed tabId");
         }
         browser.test.notifyPass("tabs-events");
       });
     });
 
     try {
-      let url = "http://example.com/browser/browser/components/extensions/test/browser/context.html";
+      let url = "http://example.com/mochitest/mobile/android/components/extensions/test/mochitest/context.html";
       let tab = await browser.tabs.create({url: url});
       await awaitLoad(tab.id);
 
       await browser.tabs.remove(tab.id);
     } catch (e) {
       browser.test.fail(`${e} :: ${e.stack}`);
       browser.test.notifyFail("tabs-events");
     }
@@ -288,8 +145,12 @@ add_task(function* testTabRemovalEvent()
 
     background,
   });
 
   yield extension.startup();
   yield extension.awaitFinish("tabs-events");
   yield extension.unload();
 });
+</script>
+
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_executeScript.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_executeScript.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript.html
@@ -1,46 +1,27 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs executeScript Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 add_task(function* testExecuteScript() {
-  let {ExtensionManagement} = Cu.import("resource://gre/modules/ExtensionManagement.jsm", {});
-  let {MessageChannel} = Cu.import("resource://gre/modules/MessageChannel.jsm", {});
-
-  function countMM(messageManagerMap) {
-    let count = 0;
-    // List of permanent message managers in the main process. We should not
-    // count them in the test because MessageChannel unsubscribes when the
-    // message manager closes, which never happens to these, of course.
-    let globalMMs = [
-      Services.mm,
-      Services.ppmm,
-      Services.ppmm.getChildAt(0),
-    ];
-    for (let mm of messageManagerMap.keys()) {
-      // Sanity check: mm is a message manager.
-      try {
-        mm.QueryInterface(Ci.nsIMessageSender);
-      } catch (e) {
-        mm.QueryInterface(Ci.nsIMessageBroadcaster);
-      }
-      if (!globalMMs.includes(mm)) {
-        ++count;
-      }
-    }
-    return count;
-  }
-
-  let messageManagersSize = countMM(MessageChannel.messageManagers);
-  let responseManagersSize = countMM(MessageChannel.responseManagers);
-
-  const BASE = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/";
+  const BASE = "http://mochi.test:8888/tests/mobile/android/components/extensions/test/mochitest/";
   const URL = BASE + "file_iframe_document.html";
-  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, URL, true);
+  let win = window.open(URL);
 
   async function background() {
     try {
       let [tab] = await browser.tabs.query({active: true, currentWindow: true});
       let frames = await browser.webNavigation.getAllFrames({tabId: tab.id});
 
       browser.test.log(`FRAMES: ${frames[1].frameId} ${JSON.stringify(frames)}\n`);
       await Promise.all([
@@ -197,21 +178,24 @@ add_task(function* testExecuteScript() {
         browser.tabs.create({url: "http://example.com/"}).then(async tab => {
           let result = await browser.tabs.executeScript(tab.id, {code: "location.href"});
 
           browser.test.assertEq("http://example.com/", result[0], "Script executed correctly in new tab");
 
           await browser.tabs.remove(tab.id);
         }),
 
+        // This currently does not work on Android.
+        /*
         browser.tabs.create({url: "about:blank"}).then(async tab => {
           const result = await browser.tabs.executeScript(tab.id, {code: "location.href", matchAboutBlank: true});
           browser.test.assertEq("about:blank", result[0], "Script executed correctly in new tab");
           await browser.tabs.remove(tab.id);
         }),
+        */
 
         new Promise(resolve => {
           browser.runtime.onMessage.addListener(message => {
             browser.test.assertEq("script ran", message, "Expected runtime message");
             resolve();
           });
         }),
       ]);
@@ -240,18 +224,14 @@ add_task(function* testExecuteScript() {
   });
 
   yield extension.startup();
 
   yield extension.awaitFinish("executeScript");
 
   yield extension.unload();
 
-  yield BrowserTestUtils.removeTab(tab);
+  win.close();
+});
+</script>
 
-  // Make sure that we're not holding on to references to closed message
-  // managers.
-  is(countMM(MessageChannel.messageManagers), messageManagersSize, "Message manager count");
-  if (!ExtensionManagement.useRemoteWebExtensions) {
-    is(countMM(MessageChannel.responseManagers), responseManagersSize, "Response manager count");
-  }
-  is(MessageChannel.pendingResponses.size, 0, "Pending response count");
-});
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript_bad.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript_bad.html
@@ -1,8 +1,21 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs executeScript Bad Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 // This is a pretty terrible hack, but it's the best we can do until we
 // support |executeScript| callbacks and |lastError|.
 function* testHasNoPermission(params) {
   let contentSetup = params.contentSetup || (() => Promise.resolve());
 
   async function background(contentSetup) {
@@ -60,91 +73,31 @@ function* testHasNoPermission(params) {
 
   extension.sendMessage("execute-script");
 
   yield extension.awaitFinish("executeScript");
   yield extension.unload();
 }
 
 add_task(function* testBadPermissions() {
-  let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "http://example.com/");
-  let tab2 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "http://mochi.test:8888/");
+  let win1 = window.open("http://example.com/");
+  let win2 = window.open("http://mochi.test:8888/");
 
   info("Test no special permissions");
   yield testHasNoPermission({
     manifest: {"permissions": ["http://example.com/"]},
   });
 
   info("Test tabs permissions");
   yield testHasNoPermission({
     manifest: {"permissions": ["http://example.com/", "tabs"]},
   });
 
-  info("Test no special permissions, commands, key press");
-  yield testHasNoPermission({
-    manifest: {
-      "permissions": ["http://example.com/"],
-      "commands": {
-        "test-tabs-executeScript": {
-          "suggested_key": {
-            "default": "Alt+Shift+K",
-          },
-        },
-      },
-    },
-    contentSetup() {
-      browser.commands.onCommand.addListener(function(command) {
-        if (command == "test-tabs-executeScript") {
-          browser.test.sendMessage("tabs-command-key-pressed");
-        }
-      });
-      return Promise.resolve();
-    },
-    setup: function* (extension) {
-      yield EventUtils.synthesizeKey("k", {altKey: true, shiftKey: true});
-      yield extension.awaitMessage("tabs-command-key-pressed");
-    },
-  });
-
-  info("Test active tab, commands, no key press");
-  yield testHasNoPermission({
-    manifest: {
-      "permissions": ["http://example.com/", "activeTab"],
-      "commands": {
-        "test-tabs-executeScript": {
-          "suggested_key": {
-            "default": "Alt+Shift+K",
-          },
-        },
-      },
-    },
-  });
-
-  info("Test active tab, browser action, no click");
-  yield testHasNoPermission({
-    manifest: {
-      "permissions": ["http://example.com/", "activeTab"],
-      "browser_action": {},
-    },
-  });
-
-  info("Test active tab, page action, no click");
-  yield testHasNoPermission({
-    manifest: {
-      "permissions": ["http://example.com/", "activeTab"],
-      "page_action": {},
-    },
-    async contentSetup() {
-      let [tab] = await browser.tabs.query({active: true, currentWindow: true});
-      await browser.pageAction.show(tab.id);
-    },
-  });
-
-  yield BrowserTestUtils.removeTab(tab2);
-  yield BrowserTestUtils.removeTab(tab1);
+  win2.close();
+  win2.close();
 });
 
 add_task(function* testBadURL() {
   async function background() {
     let promises = [
       new Promise(resolve => {
         browser.tabs.executeScript({
           file: "http://example.com/script.js",
@@ -208,10 +161,12 @@ add_task(function* testBadURL() {
 
   yield extension.unload();
 });
 
 // TODO: Test that |executeScript| fails if the tab has navigated to a
 // new page, and no longer matches our expected state. This involves
 // intentionally trying to trigger a race condition, and is probably not
 // even worth attempting until we have proper |executeScript| callbacks.
+</script>
 
-add_task(forceGC);
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_executeScript_good.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript_good.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_good.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript_good.html
@@ -1,14 +1,23 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs executeScript Good Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
-requestLongerTimeout(2);
-
 function* testHasPermission(params) {
   let contentSetup = params.contentSetup || (() => Promise.resolve());
 
   async function background(contentSetup) {
     browser.runtime.onMessage.addListener((msg, sender) => {
       browser.test.assertEq(msg, "script ran", "script ran");
       browser.test.notifyPass("executeScript");
     });
@@ -52,138 +61,31 @@ function* testHasPermission(params) {
   if (params.tearDown) {
     yield params.tearDown(extension);
   }
 
   yield extension.unload();
 }
 
 add_task(function* testGoodPermissions() {
-  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "http://mochi.test:8888/", true);
+  let win = window.open("http://mochi.test:8888/");
 
   info("Test explicit host permission");
   yield testHasPermission({
     manifest: {"permissions": ["http://mochi.test/"]},
   });
 
   info("Test explicit host subdomain permission");
   yield testHasPermission({
     manifest: {"permissions": ["http://*.mochi.test/"]},
   });
 
   info("Test explicit <all_urls> permission");
   yield testHasPermission({
     manifest: {"permissions": ["<all_urls>"]},
   });
 
-  info("Test activeTab permission with a command key press");
-  yield testHasPermission({
-    manifest: {
-      "permissions": ["activeTab"],
-      "commands": {
-        "test-tabs-executeScript": {
-          "suggested_key": {
-            "default": "Alt+Shift+K",
-          },
-        },
-      },
-    },
-    contentSetup() {
-      browser.commands.onCommand.addListener(function(command) {
-        if (command == "test-tabs-executeScript") {
-          browser.test.sendMessage("tabs-command-key-pressed");
-        }
-      });
-      return Promise.resolve();
-    },
-    setup: function* (extension) {
-      yield EventUtils.synthesizeKey("k", {altKey: true, shiftKey: true});
-      yield extension.awaitMessage("tabs-command-key-pressed");
-    },
-  });
-
-  info("Test activeTab permission with a browser action click");
-  yield testHasPermission({
-    manifest: {
-      "permissions": ["activeTab"],
-      "browser_action": {},
-    },
-    contentSetup() {
-      browser.browserAction.onClicked.addListener(() => {
-        browser.test.log("Clicked.");
-      });
-      return Promise.resolve();
-    },
-    setup: clickBrowserAction,
-    tearDown: closeBrowserAction,
-  });
-
-  info("Test activeTab permission with a page action click");
-  yield testHasPermission({
-    manifest: {
-      "permissions": ["activeTab"],
-      "page_action": {},
-    },
-    contentSetup: async () => {
-      let [tab] = await browser.tabs.query({active: true, currentWindow: true});
-      await browser.pageAction.show(tab.id);
-    },
-    setup: clickPageAction,
-    tearDown: closePageAction,
-  });
+  win.close();
+});
+</script>
 
-  info("Test activeTab permission with a browser action w/popup click");
-  yield testHasPermission({
-    manifest: {
-      "permissions": ["activeTab"],
-      "browser_action": {"default_popup": "_blank.html"},
-    },
-    setup: async extension => {
-      await clickBrowserAction(extension);
-      return awaitExtensionPanel(extension, window, "_blank.html");
-    },
-    tearDown: closeBrowserAction,
-  });
-
-  info("Test activeTab permission with a page action w/popup click");
-  yield testHasPermission({
-    manifest: {
-      "permissions": ["activeTab"],
-      "page_action": {"default_popup": "_blank.html"},
-    },
-    contentSetup: async () => {
-      let [tab] = await browser.tabs.query({active: true, currentWindow: true});
-      await browser.pageAction.show(tab.id);
-    },
-    setup: clickPageAction,
-    tearDown: closePageAction,
-  });
-
-  info("Test activeTab permission with a context menu click");
-  yield testHasPermission({
-    manifest: {
-      "permissions": ["activeTab", "contextMenus"],
-    },
-    contentSetup() {
-      browser.contextMenus.create({title: "activeTab", contexts: ["all"]});
-      return Promise.resolve();
-    },
-    setup: function* (extension) {
-      let contextMenu = document.getElementById("contentAreaContextMenu");
-      let awaitPopupShown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
-      let awaitPopupHidden = BrowserTestUtils.waitForEvent(contextMenu, "popuphidden");
-
-      yield BrowserTestUtils.synthesizeMouseAtCenter("a[href]", {type: "contextmenu", button: 2},
-                                                     gBrowser.selectedBrowser);
-      yield awaitPopupShown;
-
-      let item = contextMenu.querySelector("[label=activeTab]");
-
-      yield EventUtils.synthesizeMouseAtCenter(item, {}, window);
-
-      yield awaitPopupHidden;
-    },
-  });
-
-  yield BrowserTestUtils.removeTab(tab);
-});
-
-add_task(forceGC);
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_executeScript_no_create.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript_no_create.html
copy from browser/components/extensions/test/browser/browser_ext_tabs_executeScript_runAt.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript_runAt.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_runAt.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_executeScript_runAt.html
@@ -1,31 +1,42 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs executeScript runAt Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 /**
  * These tests ensure that the runAt argument to tabs.executeScript delays
  * script execution until the document has reached the correct state.
  *
  * Since tests of this nature are especially race-prone, it relies on a
  * server-JS script to delay the completion of our test page's load cycle long
  * enough for us to attempt to load our scripts in the earlies phase we support.
  *
  * And since we can't actually rely on that timing, it retries any attempts that
  * fail to load as early as expected, but don't load at any illegal time.
  */
 
 add_task(function* testExecuteScript() {
-  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank", true);
+  let win = window.open("about:blank");
 
   async function background() {
     let tab;
 
-    const BASE = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/";
+    const BASE = "http://mochi.test:8888/tests/mobile/android/components/extensions/test/mochitest/";
     const URL = BASE + "file_iframe_document.sjs";
 
     const MAX_TRIES = 10;
 
     try {
       [tab] = await browser.tabs.query({active: true, currentWindow: true});
 
       let success = false;
@@ -98,10 +109,14 @@ add_task(function* testExecuteScript() {
   });
 
   yield extension.startup();
 
   yield extension.awaitFinish("executeScript-runAt");
 
   yield extension.unload();
 
-  yield BrowserTestUtils.removeTab(tab);
+  win.close();
 });
+</script>
+
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_getCurrent.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_getCurrent.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_getCurrent.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_getCurrent.html
@@ -1,70 +1,70 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs getCurrent Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 add_task(function* () {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["tabs"],
-
-      "browser_action": {"default_popup": "popup.html"},
     },
 
     files: {
       "tab.js": function() {
         let url = document.location.href;
 
-        browser.tabs.getCurrent(currentTab => {
+        browser.tabs.getCurrent().then(currentTab => {
           browser.test.assertEq(currentTab.url, url, "getCurrent in non-active background tab");
 
           // Activate the tab.
           browser.tabs.onActivated.addListener(function listener({tabId}) {
             if (tabId == currentTab.id) {
               browser.tabs.onActivated.removeListener(listener);
 
-              browser.tabs.getCurrent(currentTab => {
+              browser.tabs.getCurrent().then(currentTab => {
                 browser.test.assertEq(currentTab.id, tabId, "in active background tab");
                 browser.test.assertEq(currentTab.url, url, "getCurrent in non-active background tab");
 
                 browser.test.sendMessage("tab-finished");
               });
             }
           });
           browser.tabs.update(currentTab.id, {active: true});
         });
       },
 
-      "popup.js": function() {
-        browser.tabs.getCurrent(tab => {
-          browser.test.assertEq(tab, undefined, "getCurrent in popup script");
-          browser.test.sendMessage("popup-finished");
-        });
-      },
-
-      "tab.html": `<head><meta charset="utf-8"><script src="tab.js"></script></head>`,
-      "popup.html": `<head><meta charset="utf-8"><script src="popup.js"></script></head>`,
+      "tab.html": `<head><meta charset="utf-8"><script src="tab.js"><\/script></head>`,
     },
 
     background: function() {
-      browser.tabs.getCurrent(tab => {
+      browser.tabs.getCurrent().then(tab => {
         browser.test.assertEq(tab, undefined, "getCurrent in background script");
         browser.test.sendMessage("background-finished");
       });
 
       browser.tabs.create({url: "tab.html", active: false});
     },
   });
 
   yield extension.startup();
 
   yield extension.awaitMessage("background-finished");
   yield extension.awaitMessage("tab-finished");
 
-  clickBrowserAction(extension);
-  yield awaitExtensionPanel(extension);
-  yield extension.awaitMessage("popup-finished");
-  yield closeBrowserAction(extension);
-
   // The extension tab is automatically closed when the extension unloads.
   yield extension.unload();
 });
+</script>
+
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_insertCSS.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_insertCSS.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_insertCSS.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_insertCSS.html
@@ -1,19 +1,25 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs executeScript Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 add_task(function* testExecuteScript() {
-  let {MessageChannel} = Cu.import("resource://gre/modules/MessageChannel.jsm", {});
-
-  let messageManagersSize = MessageChannel.messageManagers.size;
-  let responseManagersSize = MessageChannel.responseManagers.size;
-
-  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "http://mochi.test:8888/", true);
+  let win = window.open("http://mochi.test:8888/");
 
   async function background() {
     let tasks = [
       {
         background: "transparent",
         foreground: "rgb(0, 113, 4)",
         promise: () => {
           return browser.tabs.insertCSS({
@@ -98,16 +104,14 @@ add_task(function* testExecuteScript() {
   });
 
   yield extension.startup();
 
   yield extension.awaitFinish("insertCSS");
 
   yield extension.unload();
 
-  yield BrowserTestUtils.removeTab(tab);
+  win.close();
+});
+</script>
 
-  // Make sure that we're not holding on to references to closed message
-  // managers.
-  is(MessageChannel.messageManagers.size, messageManagersSize, "Message manager count");
-  is(MessageChannel.responseManagers.size, responseManagersSize, "Response manager count");
-  is(MessageChannel.pendingResponses.size, 0, "Pending response count");
-});
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_onUpdated.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_onUpdated.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_onUpdated.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_onUpdated.html
@@ -1,48 +1,52 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs onUpdated Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
-requestLongerTimeout(2);
-
-add_task(function* () {
-  let win1 = yield BrowserTestUtils.openNewBrowserWindow();
-
-  yield focusWindow(win1);
-
+add_task(function* test_onUpdated() {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["tabs"],
       "content_scripts": [{
         "matches": ["http://mochi.test/*/context_tabs_onUpdated_page.html"],
         "js": ["content-script.js"],
         "run_at": "document_start",
       }],
     },
 
     background: function() {
-      let pageURL = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context_tabs_onUpdated_page.html";
+      let pageURL = "http://mochi.test:8888/tests/mobile/android/components/extensions/test/mochitest/context_tabs_onUpdated_page.html";
 
       let expectedSequence = [
-        {status: "loading"},
         {status: "loading", url: pageURL},
         {status: "complete"},
       ];
       let collectedSequence = [];
 
       browser.tabs.onUpdated.addListener(function(tabId, updatedInfo) {
         // onUpdated also fires with updatedInfo.faviconUrl, so explicitly
         // check for updatedInfo.status before recording the event.
         if ("status" in updatedInfo) {
           collectedSequence.push(updatedInfo);
         }
       });
 
-      browser.runtime.onMessage.addListener(function() {
+      browser.runtime.onMessage.addListener(msg => {
         if (collectedSequence.length !== expectedSequence.length) {
           browser.test.assertEq(
             JSON.stringify(expectedSequence),
             JSON.stringify(collectedSequence),
             "got unexpected number of updateInfo data"
           );
         } else {
           for (let i = 0; i < expectedSequence.length; i++) {
@@ -78,83 +82,33 @@ add_task(function* () {
   });
 
   yield Promise.all([
     extension.startup(),
     extension.awaitFinish("tabs.onUpdated"),
   ]);
 
   yield extension.unload();
-
-  yield BrowserTestUtils.closeWindow(win1);
 });
 
 function* do_test_update(background, withPermissions = true) {
-  let win1 = yield BrowserTestUtils.openNewBrowserWindow();
-
-  yield focusWindow(win1);
-
   let manifest = {};
   if (withPermissions) {
     manifest.permissions = ["tabs", "http://mochi.test/"];
   }
   let extension = ExtensionTestUtils.loadExtension({manifest, background});
 
   yield Promise.all([
     yield extension.startup(),
     yield extension.awaitFinish("finish"),
   ]);
 
   yield extension.unload();
-
-  yield BrowserTestUtils.closeWindow(win1);
 }
 
-add_task(function* test_pinned() {
-  yield do_test_update(function background() {
-    // Create a new tab for testing update.
-    browser.tabs.create({}, function(tab) {
-      browser.tabs.onUpdated.addListener(function onUpdated(tabId, changeInfo) {
-        // Check callback
-        browser.test.assertEq(tabId, tab.id, "Check tab id");
-        browser.test.log("onUpdate: " + JSON.stringify(changeInfo));
-        if ("pinned" in changeInfo) {
-          browser.test.assertTrue(changeInfo.pinned, "Check changeInfo.pinned");
-          browser.tabs.onUpdated.removeListener(onUpdated);
-          // Remove created tab.
-          browser.tabs.remove(tabId);
-          browser.test.notifyPass("finish");
-        }
-      });
-      browser.tabs.update(tab.id, {pinned: true});
-    });
-  });
-});
-
-add_task(function* test_unpinned() {
-  yield do_test_update(function background() {
-    // Create a new tab for testing update.
-    browser.tabs.create({pinned: true}, function(tab) {
-      browser.tabs.onUpdated.addListener(function onUpdated(tabId, changeInfo) {
-        // Check callback
-        browser.test.assertEq(tabId, tab.id, "Check tab id");
-        browser.test.log("onUpdate: " + JSON.stringify(changeInfo));
-        if ("pinned" in changeInfo) {
-          browser.test.assertFalse(changeInfo.pinned, "Check changeInfo.pinned");
-          browser.tabs.onUpdated.removeListener(onUpdated);
-          // Remove created tab.
-          browser.tabs.remove(tabId);
-          browser.test.notifyPass("finish");
-        }
-      });
-      browser.tabs.update(tab.id, {pinned: false});
-    });
-  });
-});
-
 add_task(function* test_url() {
   yield do_test_update(function background() {
     // Create a new tab for testing update.
     browser.tabs.create({}, function(tab) {
       browser.tabs.onUpdated.addListener(function onUpdated(tabId, changeInfo) {
         // Check callback
         browser.test.assertEq(tabId, tab.id, "Check tab id");
         browser.test.log("onUpdate: " + JSON.stringify(changeInfo));
@@ -169,17 +123,17 @@ add_task(function* test_url() {
       });
       browser.tabs.update(tab.id, {url: "about:blank"});
     });
   });
 });
 
 add_task(function* test_title() {
   yield do_test_update(async function background() {
-    const url = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context_tabs_onUpdated_page.html";
+    const url = "http://mochi.test:8888/tests/mobile/android/components/extensions/test/mochitest/context_tabs_onUpdated_page.html";
     const tab = await browser.tabs.create({url});
 
     browser.tabs.onUpdated.addListener(function onUpdated(tabId, changeInfo) {
       browser.test.assertEq(tabId, tab.id, "Check tab id");
       browser.test.log(`onUpdated: ${JSON.stringify(changeInfo)}`);
       if ("title" in changeInfo && changeInfo.title === "New Message (1)") {
         browser.test.log("changeInfo.title is correct");
         browser.tabs.onUpdated.removeListener(onUpdated);
@@ -189,17 +143,17 @@ add_task(function* test_title() {
     });
 
     browser.tabs.executeScript(tab.id, {code: "document.title = 'New Message (1)'"});
   });
 });
 
 add_task(function* test_without_tabs_permission() {
   yield do_test_update(async function background() {
-    const url = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context_tabs_onUpdated_page.html";
+    const url = "http://mochi.test:8888/tests/mobile/android/components/extensions/test/mochitest/context_tabs_onUpdated_page.html";
     const tab = await browser.tabs.create({url});
     let count = 0;
 
     browser.tabs.onUpdated.addListener(function onUpdated(tabId, changeInfo) {
       browser.test.assertEq(tabId, tab.id, "Check tab id");
       browser.test.log(`onUpdated: ${JSON.stringify(changeInfo)}`);
 
       browser.test.assertFalse("url" in changeInfo, "url should not be included without tabs permission");
@@ -215,10 +169,12 @@ add_task(function* test_without_tabs_per
           browser.test.notifyPass("finish");
         }
       }
     });
 
     browser.tabs.reload(tab.id);
   }, false /* withPermissions */);
 });
+</script>
 
-add_task(forceGC);
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_reload.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_reload.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_reload.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_reload.html
@@ -1,26 +1,37 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs reload Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 add_task(function* () {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["tabs"],
     },
 
     files: {
       "tab.js": function() {
         browser.runtime.sendMessage("tab-loaded");
       },
       "tab.html":
         `<head>
           <meta charset="utf-8">
-          <script src="tab.js"></script>
+          <script src="tab.js"><\/script>
         </head>`,
     },
 
     async background() {
       let tabLoadedCount = 0;
 
       let tab = await browser.tabs.create({url: "tab.html", active: true});
 
@@ -47,8 +58,12 @@ add_task(function* () {
       });
     },
   });
 
   yield extension.startup();
   yield extension.awaitFinish("tabs.reload");
   yield extension.unload();
 });
+</script>
+
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_reload_bypass_cache.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_reload_bypass_cache.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_reload_bypass_cache.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_reload_bypass_cache.html
@@ -1,20 +1,31 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs executeScript bypassCache Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 add_task(function* () {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["tabs", "<all_urls>"],
     },
 
     async background() {
-      const BASE = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/";
+      const BASE = "http://mochi.test:8888/tests/mobile/android/components/extensions/test/mochitest/";
       const URL = BASE + "file_bypass_cache.sjs";
 
       function awaitLoad(tabId) {
         return new Promise(resolve => {
           browser.tabs.onUpdated.addListener(function listener(tabId_, changed, tab) {
             if (tabId == tabId_ && changed.status == "complete" && tab.url == URL) {
               browser.tabs.onUpdated.removeListener(listener);
               resolve();
@@ -51,8 +62,12 @@ add_task(function* () {
       }
     },
   });
 
   yield extension.startup();
   yield extension.awaitFinish("tabs.reload_bypass_cache");
   yield extension.unload();
 });
+</script>
+
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_sendMessage.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_sendMessage.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_sendMessage.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_sendMessage.html
@@ -1,10 +1,21 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs sendMessage Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 add_task(function* tabsSendMessageReply() {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["tabs"],
 
       "content_scripts": [{
@@ -197,17 +208,17 @@ add_task(function* tabsSendHidden() {
 
 add_task(function* tabsSendMessageNoExceptionOnNonExistentTab() {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["tabs"],
     },
 
     async background() {
-      let url = "http://example.com/mochitest/browser/browser/components/extensions/test/browser/file_dummy.html";
+      let url = "http://example.com/mochitest/tests/mobile/android/components/extensions/test/mochitest/file_dummy.html";
       let tab = await browser.tabs.create({url});
 
       try {
         browser.tabs.sendMessage(tab.id, "message");
         browser.tabs.sendMessage(tab.id + 100, "message");
       } catch (e) {
         browser.test.fail("no exception should be raised on tabs.sendMessage to nonexistent tabs");
       }
@@ -220,8 +231,12 @@ add_task(function* tabsSendMessageNoExce
 
   yield Promise.all([
     extension.startup(),
     extension.awaitFinish("tabs.sendMessage"),
   ]);
 
   yield extension.unload();
 });
+</script>
+
+</body>
+</html>
copy from browser/components/extensions/test/browser/browser_ext_tabs_update_url.js
copy to mobile/android/components/extensions/test/mochitest/test_ext_tabs_update_url.html
--- a/browser/components/extensions/test/browser/browser_ext_tabs_update_url.js
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_update_url.html
@@ -1,10 +1,21 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Tabs update Test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+  <script type="text/javascript" src="head.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
 "use strict";
 
 function* testTabsUpdateURL(existentTabURL, tabsUpdateURL, isErrorExpected) {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["tabs"],
     },
 
@@ -48,22 +59,22 @@ function* testTabsUpdateURL(existentTabU
   let mozExtTabURL = yield extension.awaitMessage("ready");
 
   if (tabsUpdateURL == "self") {
     tabsUpdateURL = mozExtTabURL;
   }
 
   info(`tab.update URL "${tabsUpdateURL}" on tab with URL "${existentTabURL}"`);
 
-  let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, existentTabURL);
+  let tab1 = window.open(existentTabURL);
 
   extension.sendMessage("start", tabsUpdateURL, isErrorExpected);
   yield extension.awaitMessage("done");
 
-  yield BrowserTestUtils.removeTab(tab1);
+  tab1.close();
   yield extension.unload();
 }
 
 add_task(function* () {
   info("Start testing tabs.update on javascript URLs");
 
   let dataURLPage = `data:text/html,
     <!DOCTYPE html>
@@ -103,8 +114,12 @@ add_task(function* () {
         .map((check) => Object.assign({}, check, {existentTabURL: "about:blank"}));
 
   for (let {existentTabURL, tabsUpdateURL, isErrorExpected} of testCases) {
     yield* testTabsUpdateURL(existentTabURL, tabsUpdateURL, isErrorExpected);
   }
 
   info("done");
 });
+</script>
+
+</body>
+</html>