• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

visgl / luma.gl / 27017296180

05 Jun 2026 01:20PM UTC coverage: 70.704% (+0.1%) from 70.564%
27017296180

push

github

web-flow
chore: Minor API completions and doc improvements (#2665)

8861 of 14167 branches covered (62.55%)

Branch coverage included in aggregate %.

174 of 196 new or added lines in 15 files covered. (88.78%)

1 existing line in 1 file now uncovered.

18353 of 24323 relevant lines covered (75.46%)

4341.87 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

69.23
/dev-modules/devtools-extensions/playwright/select-device-backend.mjs
1
const DEVICE_TAB_LABELS = {
1✔
2
  'webgpu-core': 'WebGPU',
3
  'webgpu-max': 'WebGPU',
4
  webgl: 'WebGL2',
5
  webgl2: 'WebGL2',
6
  webgpu: 'WebGPU'
7
};
8
const SELECTED_DEVICE_TAB_ATTRIBUTE = 'data-luma-device-tab-selected';
1✔
9

10
function normalizeBackend(backend) {
11
  if (!backend) {
4!
12
    return null;
×
13
  }
14

15
  const normalizedBackend = backend.toLowerCase();
4✔
16
  switch (normalizedBackend) {
4!
17
    case 'webgl':
18
    case 'webgl2':
NEW
19
      return 'webgl';
×
20
    case 'webgpu':
21
    case 'webgpu-core':
22
    case 'core':
23
      return 'webgpu-core';
1✔
24
    case 'webgpu-max':
25
    case 'max':
26
      return 'webgpu-max';
3✔
27
    default:
NEW
28
      return normalizedBackend;
×
29
  }
30
}
31

32
export async function selectDeviceBackend(page, backend) {
33
  const normalizedBackend = normalizeBackend(backend);
3✔
34
  if (!normalizedBackend) {
3!
35
    return false;
×
36
  }
37

38
  const tabLabel = DEVICE_TAB_LABELS[normalizedBackend];
3✔
39
  if (!tabLabel) {
3!
40
    throw new Error(`Unsupported backend "${backend}"`);
×
41
  }
42

43
  const tab = page.locator(`[data-luma-device-tab="${normalizedBackend}"]`);
3✔
44
  if ((await tab.count()) === 0) {
3!
45
    return false;
×
46
  }
47

48
  const deviceTab = tab.first();
3✔
49
  if (await isDisabledDeviceTab(deviceTab)) {
3✔
50
    return false;
2✔
51
  }
52

53
  if (await isSelectedDeviceTab(deviceTab)) {
1!
NEW
54
    return true;
×
55
  }
56

57
  await deviceTab.click();
1✔
58
  await page.waitForLoadState('networkidle').catch(() => {});
1✔
59
  await page
1✔
60
    .waitForFunction(
61
      selectedBackend =>
NEW
62
        document
×
63
          .querySelector(`[data-luma-device-tab="${selectedBackend}"]`)
64
          ?.getAttribute('data-luma-device-tab-selected') === 'true',
65
      normalizedBackend,
66
      {timeout: 5000}
67
    )
68
    .catch(() => {});
69
  return await isSelectedDeviceTab(deviceTab);
1✔
70
}
71

72
export async function selectPreferredDeviceBackend(page, preferredBackend = 'webgpu') {
1✔
73
  const normalizedPreferredBackend = normalizeBackend(preferredBackend) || 'webgpu';
1!
74
  const orderedBackends =
75
    normalizedPreferredBackend === 'webgl'
1!
76
      ? ['webgl', 'webgpu-core']
77
      : [normalizedPreferredBackend, 'webgpu-core', 'webgl'].filter(
78
          (backend, index, array) => array.indexOf(backend) === index
3✔
79
        );
80

81
  for (const backend of orderedBackends) {
1✔
82
    if (await selectDeviceBackend(page, backend)) {
2✔
83
      return backend;
1✔
84
    }
85
  }
86

87
  return null;
×
88
}
89

90
async function isDisabledDeviceTab(tab) {
91
  return (await tab.getAttribute('aria-disabled')) === 'true';
3✔
92
}
93

94
async function isSelectedDeviceTab(tab) {
95
  return (await tab.getAttribute(SELECTED_DEVICE_TAB_ATTRIBUTE)) === 'true';
2✔
96
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc