tor-browser

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

health-thermometer-iframe.html (3360B)


      1 <!DOCTYPE html>
      2 <script src="/resources/testdriver.js"></script>
      3 <script src="/resources/testdriver-vendor.js"></script>
      4 <body>
      5 <button>Click me!</button>
      6 <script>
      7 let device, gatt;
      8 
      9 test_driver.set_test_context(parent);
     10 
     11 function requestDeviceWithOptionsAndConnect(options) {
     12  return test_driver.click(document.getElementsByTagName("button")[0])
     13      .then(() => navigator.bluetooth.requestDevice(options))
     14      .then(device => device.gatt.connect());
     15 }
     16 
     17 window.addEventListener('message', (messageEvent) => {
     18  switch (messageEvent.data.type) {
     19    case 'GetAvailability':
     20      navigator.bluetooth.getAvailability()
     21          .then(availability => parent.postMessage(availability, '*'))
     22          .catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
     23      break;
     24    case 'GetDevices':
     25      navigator.bluetooth.getDevices()
     26          .then(devices => parent.postMessage('Success', '*'))
     27          .catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
     28      break;
     29    case 'RequestDevice':
     30      test_driver.click(document.getElementsByTagName('button')[0])
     31          .then(
     32              () => navigator.bluetooth.requestDevice(
     33                  {filters: [{services: ['generic_access']}]}))
     34          .then(device => {
     35            if (device.constructor.name === 'BluetoothDevice') {
     36              parent.postMessage('Success', '*');
     37            } else {
     38              parent.postMessage(
     39                  `FAIL: requestDevice in iframe returned ${device.name}`, '*');
     40            }
     41          })
     42          .catch(err => parent.postMessage(`FAIL: ${err.name}: ${err.message}`, '*'));
     43      break;
     44    case 'RequestLEScan':
     45      test_driver.click(document.getElementsByTagName('button')[0])
     46          .then(
     47              () => navigator.bluetooth.requestLEScan(
     48                {filters: [{name: 'Health Thermometer'}]}))
     49          .then(leScan => {
     50              if (leScan.active) {
     51                parent.postMessage('Success', '*');
     52                leScan.stop();
     53              } else {
     54                parent.postMessage(`FAIL: the LE scan hasn't been initiated.`, '*');
     55              }
     56          })
     57          .catch(err => parent.postMessage(`FAIL: ${err.name}: ${err.message}`, '*'));
     58      break;
     59    case 'RequestAndConnect':
     60      requestDeviceWithOptionsAndConnect(messageEvent.data.options)
     61          .then(_ => {
     62            gatt = _;
     63            device = gatt.device;
     64            parent.postMessage('Connected', '*');
     65          })
     66          .catch(err => {
     67            parent.postMessage(`FAIL: ${err}`, '*');
     68          });
     69      break;
     70    case 'DiscoverServices':
     71      requestDeviceWithOptionsAndConnect(messageEvent.data.options)
     72          .then(gatt => gatt.getPrimaryServices())
     73          .then(() => parent.postMessage('DiscoveryComplete', '*'))
     74          .catch(err => {
     75            parent.postMessage(`FAIL: ${err}`, '*');
     76          });
     77      break;
     78    case 'GetService':
     79      if (typeof gatt === 'undefined') {
     80        parent.postMessage('FAIL: no GATT server', '*');
     81        break;
     82      }
     83      gatt.getPrimaryService(messageEvent.data.options)
     84          .then(() => parent.postMessage('ServiceReceived', '*'))
     85          .catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
     86      break;
     87    default:
     88      parent.postMessage(
     89          `FAIL: Bad message type: ${messageEvent.data.type}`, '*');
     90  }
     91 });
     92 </script>