summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/web-share/resources/manual-helper.js
blob: 15bb17936e4479f7338b7cefbaa87522a2a02df4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Internal function. Returns [instruction, list] DOM elements.
function setupManualShareTestCommon() {
  const div = document.createElement('div');
  document.body.appendChild(div);

  const instruction = document.createElement('div');
  instruction.id = 'instruction';
  div.appendChild(instruction);

  const shareButton = document.createElement('input');
  shareButton.id = 'share_button';
  shareButton.value = 'Share button';
  shareButton.type = 'button';
  div.appendChild(shareButton);

  let heading = document.createElement('h2');
  heading.innerText = 'Instructions:';
  instruction.appendChild(heading);
  let list = document.createElement('ol');
  instruction.appendChild(list);
  let item = document.createElement('li');
  list.appendChild(item);
  item.innerText = 'Click the Share button.';

  return [instruction, list];
}

// Sets up the page for running manual tests. Automatically creates the
// instructions (based on the parameters) and the share button.
function setupManualShareTest(expected_share_data) {
  const {title, text, url, files} = expected_share_data;
  let [instruction, list] = setupManualShareTestCommon();
  let item = document.createElement('li');
  list.appendChild(item);
  item.innerText = 'Choose a valid share target.';

  heading = document.createElement('h2');
  heading.innerText = 'Pass the test iff the target app received:';
  instruction.appendChild(heading);

  list = document.createElement('ul');
  instruction.appendChild(list);

  item = document.createElement('li');
  list.appendChild(item);
  item.innerText = `title = "${title}"`;
  item = document.createElement('li');
  list.appendChild(item);
  item.innerText = `text = "${text}"`;
  item = document.createElement('li');
  list.appendChild(item);
  item.innerText = `url = "${url}"`;
  if (files) {
    item = document.createElement('li');
    list.appendChild(item);
    item.innerText = `files = ${files.length} file(s)`;
    for (let file of files) {
      const div = document.createElement('div');
      if (file.type.startsWith('text/')) {
        const reader = new FileReader();
        reader.onload = () => {
          div.textContent = reader.result;
        };
        reader.readAsText(file);
      } else if (file.type.startsWith('image/')) {
        const image = document.createElement('img');
        image.src = URL.createObjectURL(file);
        image.alt = file.name;
        div.appendChild(image);
      }
      item.appendChild(div);
    }
  }
}

function setupManualShareTestRequiringCancellation() {
  const [instruction, list] = setupManualShareTestCommon();
  const item = document.createElement('li');
  list.appendChild(item);
  item.innerText = 'Cancel the share dialog.';
}

// Returns a promise. When the user clicks the button, calls
// |click_handler| and resolves the promise with the result.
function callWhenButtonClicked(click_handler) {
  return new Promise((resolve, reject) => {
    document.querySelector('#share_button').onclick = () => {
      try {
        const result = click_handler();
        resolve(result);
      } catch (e) {
        reject(e);
      }
    };
  });
}

function getAbsoluteUrl(url) {
  return new URL(url, document.baseURI).toString();
}