tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_closePayment.html (10196B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <!--
      4 https://bugzilla.mozilla.org/show_bug.cgi?id=1408234
      5 -->
      6 <head>
      7  <meta charset="utf-8">
      8  <title>Test for closing PaymentRequest</title>
      9  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
     10  <script src="/tests/SimpleTest/SimpleTest.js"></script>
     11  <script type="application/javascript" src="DefaultData.js"></script>
     12  <script type="application/javascript">
     13 
     14  "use strict";
     15  SimpleTest.waitForExplicitFinish();
     16 
     17  var gUrl = SimpleTest.getTestFileURL('ClosePaymentChromeScript.js');
     18  var gScript = SpecialPowers.loadChromeScript(gUrl);
     19 
     20  function testFailHandler(message) {
     21    ok(false, message);
     22  }
     23  function testPassHandler(message) {
     24    ok(true, message);
     25  }
     26  gScript.addMessageListener("test-fail", testFailHandler);
     27  gScript.addMessageListener("test-pass", testPassHandler);
     28 
     29  async function requestChromeAction(action, params) {
     30    gScript.sendAsyncMessage(action, params);
     31    await new Promise(resolve => {
     32      gScript.addMessageListener(`${action}-complete`, function completeListener() {
     33        gScript.removeMessageListener(`${action}-complete`, completeListener);
     34        resolve();
     35      });
     36    });
     37  }
     38 
     39  async function testCloseByReloading() {
     40    const testName = "testCloseByReloading";
     41    await requestChromeAction("test-setup", testName);
     42    info(testName);
     43    let nextStatus = ["creating", "reloading"];
     44    let currStatus = nextStatus.shift();
     45    let ifr = document.createElement('iframe');
     46    await requestChromeAction("payment-num-set");
     47 
     48    await new Promise((resolve) => {
     49      let listener = function(event) {
     50        is(event.data, "successful",
     51           `${testName}: Expected 'successful' when ${currStatus}, but got '${event.data}'.`);
     52        if (currStatus === "creating") {
     53          ifr.contentWindow.location.reload();
     54        } else if (currStatus === "reloading") {
     55          window.removeEventListener("message", listener);
     56          resolve();
     57        }
     58        currStatus = nextStatus.shift();
     59      }
     60      window.addEventListener("message", listener);
     61      ifr.src = "simple_payment_request.html";
     62      document.body.appendChild(ifr);
     63    });
     64 
     65    await requestChromeAction("payment-num-check", 1);
     66    document.body.removeChild(ifr);
     67 
     68  }
     69 
     70  async function testCloseByRedirecting() {
     71    const testName = "testCloseByRedirecting";
     72    await requestChromeAction("test-setup", testName);
     73    return new Promise((resolve) => {
     74      let nextStatus = ["creating", "redirecting"];
     75      let currStatus = nextStatus.shift();
     76      let ifr = document.createElement('iframe');
     77      let listener = async function(event) {
     78        is(event.data, "successful",
     79           `${testName}: Expected 'successful' when ${currStatus}, but got '${event.data}'.`);
     80        if (currStatus === "creating") {
     81          ifr.src = "blank_page.html";
     82        } else if (currStatus === "redirecting"){
     83          window.removeEventListener("message", listener);
     84          await requestChromeAction("close-check");
     85          document.body.removeChild(ifr);
     86          resolve();
     87        }
     88        currStatus = nextStatus.shift();
     89      };
     90      window.addEventListener("message", listener);
     91      ifr.src = "simple_payment_request.html";
     92      document.body.appendChild(ifr);
     93    });
     94  }
     95 
     96  async function testCloseByRedirectingAfterShow() {
     97    const testName = "testCloseByRedirectingAfterShow";
     98    await requestChromeAction("test-setup", testName);
     99    return new Promise((resolve) => {
    100      let nextStatus = ["creating", "showing", "redirecting"];
    101      let currStatus = nextStatus.shift();
    102      let ifr = document.createElement('iframe');
    103      let handler = undefined;
    104      let listener = async (event) => {
    105        is(event.data, "successful",
    106           `${testName}: Expected 'successful' when ${currStatus}, but got '${event.data}'.`);
    107        if (currStatus === "creating") {
    108          handler = SpecialPowers.getDOMWindowUtils(ifr.contentWindow).setHandlingUserInput(true);
    109          ifr.contentWindow.postMessage("show PaymentRequest", "*");
    110        } else if (currStatus === "showing") {
    111          handler.destruct();
    112          ifr.src = "blank_page.html";
    113        } else if (currStatus === "redirecting") {
    114          window.removeEventListener("message", listener);
    115          await requestChromeAction("close-check");
    116          await requestChromeAction("reject-payment", true);
    117          document.body.removeChild(ifr);
    118          resolve();
    119        }
    120        currStatus = nextStatus.shift();
    121      }
    122      window.addEventListener("message", listener);
    123      ifr.src = "simple_payment_request.html";
    124      document.body.appendChild(ifr);
    125    });
    126  }
    127 
    128  async function testCloseByRemovingIframe() {
    129    const testName = "testCloseByRemovingIframe";
    130    await requestChromeAction("test-setup", testName);
    131    return new Promise((resolve) => {
    132      let nextStatus = ["creating"];
    133      let currStatus = nextStatus.shift();
    134      let ifr = document.createElement('iframe');
    135      let listener = async function(event) {
    136        is(event.data, "successful",
    137           `${testName}: Expected 'successful' when ${currStatus}, but got '${event.data}'.`);
    138        document.body.removeChild(ifr);
    139        window.removeEventListener("message", listener);
    140        await requestChromeAction("close-check");
    141        resolve();
    142      };
    143      window.addEventListener("message", listener);
    144      ifr.src = "simple_payment_request.html";
    145      document.body.appendChild(ifr);
    146    });
    147  }
    148 
    149  async function testUpdateWithRespondedPayment() {
    150    const testName = "testUpdateWithRespondedPayment";
    151    await requestChromeAction("test-setup", testName);
    152    return new Promise(resolve => {
    153      let nextStatus = ["creating", "showing", "closing", "updating", "finishing"];
    154      let currStatus = nextStatus.shift();
    155      let ifr = document.createElement('iframe');
    156      let handler = undefined;
    157      let listener = async function(event) {
    158        is(event.data, "successful",
    159           `${testName}: Expected 'successful' when ${currStatus}, but got '${event.data}'.`);
    160        switch (currStatus) {
    161          case "creating":
    162            handler = SpecialPowers.getDOMWindowUtils(ifr.contentWindow).setHandlingUserInput(true);
    163            ifr.contentWindow.postMessage("show PaymentRequest", "*");
    164            break;
    165          case "showing":
    166            await requestChromeAction("update-payment");
    167            break;
    168          case "closing":
    169            await requestChromeAction("reject-payment", false);
    170            break;
    171          case "updating":
    172            await requestChromeAction("close-check");
    173            ifr.contentWindow.postMessage("updateWith PaymentRequest", "*");
    174            break;
    175          case "finishing":
    176            handler.destruct();
    177            document.body.removeChild(ifr);
    178            window.removeEventListener("message", listener);
    179            resolve();
    180            break;
    181          default:
    182            ok(false, testName + ": Unknown status()" + currStatus);
    183            break;
    184        }
    185        currStatus = nextStatus.shift();
    186      }
    187      window.addEventListener("message", listener);
    188      ifr.src = "simple_payment_request.html";
    189      document.body.appendChild(ifr);
    190    });
    191  }
    192 
    193  function getLoadedPaymentRequest(iframe, url) {
    194    return new Promise(resolve => {
    195      iframe.addEventListener(
    196        "load",
    197        () => {
    198          const { PaymentRequest } = iframe.contentWindow;
    199          const request = new PaymentRequest(defaultMethods, defaultDetails);
    200          resolve(request);
    201        },
    202        { once: true }
    203      );
    204      iframe.src = url;
    205    });
    206  }
    207 
    208  async function testNonfullyActivePayment() {
    209    const testName = "testNonfullyActivePayment";
    210    await requestChromeAction("test-setup", testName);
    211 
    212    const outer = document.createElement("iframe");
    213    outer.allow = "payment";
    214    document.body.appendChild(outer);
    215    await getLoadedPaymentRequest(outer,"blank_page.html");
    216 
    217    const inner = outer.contentDocument.createElement("iframe");
    218    inner.allow = "payment";
    219    outer.contentDocument.body.appendChild(inner);
    220 
    221    const request = await getLoadedPaymentRequest(inner,"blank_page.html");
    222    ok(request, `${testName}: PaymentRequest in inner iframe should exist.`);
    223 
    224    await new Promise(res => {
    225      outer.addEventListener("load", res);
    226      outer.src = "simple_payment_request.html";
    227    });
    228 
    229    let handler = SpecialPowers.getDOMWindowUtils(inner.contentWindow).setHandlingUserInput(true);
    230    try {
    231      const showPromise = await request.show();
    232      ok(false, `${testName}: expected 'AbortError', but got resolved.`);
    233    } catch (error) {
    234      is(error.name, "AbortError",
    235         `${testName}: expected 'AbortError'.`);
    236    }
    237    await handler.destruct();
    238    inner.remove();
    239    outer.remove();
    240  }
    241 
    242  async function teardown() {
    243    return new Promise((resolve) => {
    244      gScript.addMessageListener("teardown-complete", function teardownCompleteHandler() {
    245        gScript.removeMessageListener("teardown-complete", teardownCompleteHandler);
    246        gScript.removeMessageListener("test-fail", testFailHandler);
    247        gScript.removeMessageListener("test-pass", testPassHandler);
    248        gScript.destroy();
    249        SimpleTest.finish();
    250        resolve();
    251      });
    252      gScript.sendAsyncMessage("teardown");
    253    });
    254  }
    255 
    256  async function runTests() {
    257    try {
    258      await testCloseByReloading();
    259      await testCloseByRedirecting();
    260      await testCloseByRedirectingAfterShow();
    261      await testCloseByRemovingIframe();
    262      await testUpdateWithRespondedPayment();
    263      await testNonfullyActivePayment();
    264      await teardown();
    265    } catch(e) {
    266      ok(false, "test_closePayment.html: Unexpected error: " + e.name);
    267      SimpleTest.finish();
    268    }
    269  }
    270 
    271  window.addEventListener('load', function() {
    272    SpecialPowers.pushPrefEnv({
    273      'set': [
    274        ['dom.payments.request.enabled', true],
    275      ]
    276    }, runTests);
    277  });
    278  </script>
    279 </head>
    280 <body>
    281 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1408234">Mozilla Bug 1408234</a>
    282 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1483470">Mozilla Bug 1483470</a>
    283 </body>
    284 </html>