<!DOCTYPE HTML>
<html>
<head>
  <title>WebExtension 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" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>

<script type="text/javascript">
"use strict";

add_task(function* test_webext_tab_subframe_privileges() {
  function background() {
    browser.runtime.onMessage.addListener(async ({msg, success, tabId, error}) => {
      if (msg == "webext-tab-subframe-privileges") {
        if (success) {
          await browser.tabs.remove(tabId);

          browser.test.notifyPass(msg);
        } else {
          browser.test.log(`Got an unexpected error: ${error}`);

          let tabs = await browser.tabs.query({active: true});
          await browser.tabs.remove(tabs[0].id);

          browser.test.notifyFail(msg);
        }
      }
    });
    browser.tabs.create({url: browser.runtime.getURL("/tab.html")});
  }

  async function tabSubframeScript() {
    browser.test.assertTrue(browser.tabs != undefined,
                            "Subframe of a privileged page has access to privileged APIs");
    if (browser.tabs) {
      try {
        let tab = await browser.tabs.getCurrent();
        browser.runtime.sendMessage({
          msg: "webext-tab-subframe-privileges",
          success: true,
          tabId: tab.id,
        });
      } catch (e) {
        browser.runtime.sendMessage({msg: "webext-tab-subframe-privileges", success: false, error: `${e}`});
      }
    } else {
      browser.runtime.sendMessage({
        msg: "webext-tab-subframe-privileges",
        success: false,
        error: `Privileged APIs missing in WebExtension tab sub-frame`,
      });
    }
  }

  let extensionData = {
    background,
    files: {
      "tab.html": `<!DOCTYPE>
          <head>
            <meta charset="utf-8">
          </head>
          <body>
            <iframe src="tab-subframe.html"></iframe>
          </body>
        </html>`,
      "tab-subframe.html": `<!DOCTYPE>
          <head>
            <meta charset="utf-8">
            <script src="tab-subframe.js"><\/script>
          </head>
        </html>`,
      "tab-subframe.js": tabSubframeScript,
    },
  };
  let extension = ExtensionTestUtils.loadExtension(extensionData);

  yield extension.startup();

  yield extension.awaitFinish("webext-tab-subframe-privileges");
  yield extension.unload();
});

add_task(function* test_webext_background_subframe_privileges() {
  function backgroundSubframeScript() {
    browser.test.assertTrue(browser.tabs != undefined,
                            "Subframe of a background page has access to privileged APIs");
    browser.test.notifyPass("webext-background-subframe-privileges");
  }

  let extensionData = {
    manifest: {
      background: {
        page: "background.html",
      },
    },
    files: {
      "background.html": `<!DOCTYPE>
         <head>
           <meta charset="utf-8">
         </head>
         <body>
           <iframe src="background-subframe.html"></iframe>
         </body>
       </html>`,
      "background-subframe.html": `<!DOCTYPE>
         <head>
           <meta charset="utf-8">
           <script src="background-subframe.js"><\/script>
         </head>
       </html>`,
      "background-subframe.js": backgroundSubframeScript,
    },
  };
  let extension = ExtensionTestUtils.loadExtension(extensionData);

  yield extension.startup();

  yield extension.awaitFinish("webext-background-subframe-privileges");
  yield extension.unload();
});

add_task(function* test_webext_contentscript_iframe_subframe_privileges() {
  function background() {
    browser.runtime.onMessage.addListener(({name, hasTabsAPI, hasStorageAPI}) => {
      if (name == "contentscript-iframe-loaded") {
        browser.test.assertFalse(hasTabsAPI,
                                 "Subframe of a content script privileged iframes has no access to privileged APIs");
        browser.test.assertTrue(hasStorageAPI,
                                 "Subframe of a content script privileged iframes has access to content script APIs");

        browser.test.notifyPass("webext-contentscript-subframe-privileges");
      }
    });
  }

  function subframeScript() {
    browser.runtime.sendMessage({
      name: "contentscript-iframe-loaded",
      hasTabsAPI: browser.tabs != undefined,
      hasStorageAPI: browser.storage != undefined,
    });
  }

  function contentScript() {
    let iframe = document.createElement("iframe");
    iframe.setAttribute("src", browser.runtime.getURL("/contentscript-iframe.html"));
    document.body.appendChild(iframe);
  }

  let extensionData = {
    background,
    manifest: {
      "permissions": ["storage"],
      "content_scripts": [{
        "matches": ["http://example.com/*"],
        "js": ["contentscript.js"],
      }],
      web_accessible_resources: [
        "contentscript-iframe.html",
      ],
    },
    files: {
      "contentscript.js": contentScript,
      "contentscript-iframe.html": `<!DOCTYPE>
         <head>
           <meta charset="utf-8">
         </head>
         <body>
           <iframe src="contentscript-iframe-subframe.html"></iframe>
         </body>
       </html>`,
      "contentscript-iframe-subframe.html": `<!DOCTYPE>
         <head>
           <meta charset="utf-8">
           <script src="contentscript-iframe-subframe.js"><\/script>
         </head>
       </html>`,
      "contentscript-iframe-subframe.js": subframeScript,
    },
  };
  let extension = ExtensionTestUtils.loadExtension(extensionData);

  yield extension.startup();

  let win = window.open("http://example.com");

  yield extension.awaitFinish("webext-contentscript-subframe-privileges");

  win.close();

  yield extension.unload();
});

</script>

</body>
</html>