Skip to content

Commit b8cfc23

Browse files
committed
Fix HTML5 battery API
The old `navigator.battery` API is not longer present in modern browsers which all use `navigator.getBattery()`. Tested locally on my laptop.
1 parent aa20b04 commit b8cfc23

File tree

2 files changed

+49
-30
lines changed

2 files changed

+49
-30
lines changed

src/lib/libhtml5.js

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2091,18 +2091,18 @@ var LibraryHTML5 = {
20912091
return registerBeforeUnloadEventCallback({{{ cDefs.EMSCRIPTEN_EVENT_TARGET_WINDOW }}}, userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BEFOREUNLOAD }}}, "beforeunload");
20922092
},
20932093

2094-
$fillBatteryEventData: (eventStruct, e) => {
2095-
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.chargingTime, 'e.chargingTime', 'double') }}};
2096-
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.dischargingTime, 'e.dischargingTime', 'double') }}};
2097-
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.level, 'e.level', 'double') }}};
2098-
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.charging, 'e.charging', 'i8') }}};
2094+
$fillBatteryEventData: (eventStruct, battery) => {
2095+
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.chargingTime, 'battery.chargingTime', 'double') }}};
2096+
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.dischargingTime, 'battery.dischargingTime', 'double') }}};
2097+
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.level, 'battery.level', 'double') }}};
2098+
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.charging, 'battery.charging', 'i8') }}};
20992099
},
21002100

2101-
$battery: () => navigator.battery || navigator.mozBattery || navigator.webkitBattery,
2101+
$hasBatteryAPI: () => typeof navigator != 'undefined' && navigator.getBattery,
21022102

21032103
$registerBatteryEventCallback__noleakcheck: true,
2104-
$registerBatteryEventCallback__deps: ['$JSEvents', '$fillBatteryEventData', '$battery', '$findEventTarget', 'malloc'],
2105-
$registerBatteryEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
2104+
$registerBatteryEventCallback__deps: ['$JSEvents', '$fillBatteryEventData', 'malloc'],
2105+
$registerBatteryEventCallback: (battery, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
21062106
#if PTHREADS
21072107
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
21082108
#endif
@@ -2114,7 +2114,7 @@ var LibraryHTML5 = {
21142114
#else
21152115
var batteryEvent = JSEvents.batteryEvent;
21162116
#endif
2117-
fillBatteryEventData(batteryEvent, battery());
2117+
fillBatteryEventData(batteryEvent, battery);
21182118

21192119
#if PTHREADS
21202120
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, batteryEvent, userData);
@@ -2124,7 +2124,7 @@ var LibraryHTML5 = {
21242124
};
21252125

21262126
var eventHandler = {
2127-
target: findEventTarget(target),
2127+
target: battery,
21282128
eventTypeString,
21292129
callbackfunc,
21302130
handlerFunc: batteryEventHandlerFunc,
@@ -2134,24 +2134,35 @@ var LibraryHTML5 = {
21342134
},
21352135

21362136
emscripten_set_batterychargingchange_callback_on_thread__proxy: 'sync',
2137-
emscripten_set_batterychargingchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery'],
2137+
emscripten_set_batterychargingchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$hasBatteryAPI'],
21382138
emscripten_set_batterychargingchange_callback_on_thread: (userData, callbackfunc, targetThread) => {
2139-
if (!battery()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
2140-
return registerBatteryEventCallback(battery(), userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYCHARGINGCHANGE }}}, "chargingchange", targetThread);
2139+
if (!hasBatteryAPI()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
2140+
navigator.getBattery().then((b) => {
2141+
registerBatteryEventCallback(b, userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYCHARGINGCHANGE }}}, "chargingchange", targetThread);
2142+
});
21412143
},
21422144

21432145
emscripten_set_batterylevelchange_callback_on_thread__proxy: 'sync',
2144-
emscripten_set_batterylevelchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery'],
2146+
emscripten_set_batterylevelchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$hasBatteryAPI'],
21452147
emscripten_set_batterylevelchange_callback_on_thread: (userData, callbackfunc, targetThread) => {
2146-
if (!battery()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
2147-
return registerBatteryEventCallback(battery(), userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYLEVELCHANGE }}}, "levelchange", targetThread);
2148+
if (!hasBatteryAPI()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
2149+
navigator.getBattery().then((b) => {
2150+
registerBatteryEventCallback(b, userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYLEVELCHANGE }}}, "levelchange", targetThread);
2151+
});
21482152
},
21492153

2154+
$batteryManager: undefined,
21502155
emscripten_get_battery_status__proxy: 'sync',
2151-
emscripten_get_battery_status__deps: ['$fillBatteryEventData', '$battery'],
2156+
emscripten_get_battery_status__deps: ['$fillBatteryEventData', '$hasBatteryAPI', '$batteryManager'],
21522157
emscripten_get_battery_status: (batteryState) => {
2153-
if (!battery()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
2154-
fillBatteryEventData(batteryState, battery());
2158+
if (!hasBatteryAPI()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
2159+
if (!batteryManager) {
2160+
navigator.getBattery().then((b) => {
2161+
batteryManager = b;
2162+
});
2163+
return {{{ cDefs.EMSCRIPTEN_RESULT_NO_DATA }}};
2164+
}
2165+
fillBatteryEventData(batteryState, batteryManager);
21552166
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
21562167
},
21572168

test/test_html5_core.c

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -209,25 +209,39 @@ void formatTime(char *str, int seconds) {
209209
}
210210
}
211211

212-
bool battery_callback(int eventType, const EmscriptenBatteryEvent *e, void *userData) {
212+
void log_battery_state(const EmscriptenBatteryEvent *e) {
213213
char t1[64];
214214
formatTime(t1, (int)e->chargingTime);
215215
char t2[64];
216216
formatTime(t2, (int)e->dischargingTime);
217-
printf("%s: chargingTime: %s, dischargingTime: %s, level: %g%%, charging: %d\n",
218-
emscripten_event_type_to_string(eventType), t1, t2, e->level*100, e->charging);
217+
printf("battery status: chargingTime: %s, dischargingTime: %s, level: %g%%, charging: %d\n", t1, t2, e->level*100, e->charging);
218+
}
219219

220+
bool battery_callback(int eventType, const EmscriptenBatteryEvent *e, void *userData) {
221+
printf("%s\n", emscripten_event_type_to_string(eventType));
222+
log_battery_state(e);
220223
return 0;
221224
}
222225

223226
bool webglcontext_callback(int eventType, const void *reserved, void *userData) {
224227
printf("%s.\n", emscripten_event_type_to_string(eventType));
225-
226228
return 0;
227229
}
228230

231+
void report_battery_state() {
232+
EmscriptenBatteryEvent bs;
233+
int ret = emscripten_get_battery_status(&bs);
234+
TEST_RESULT(emscripten_get_battery_status);
235+
if (ret == EMSCRIPTEN_RESULT_SUCCESS) {
236+
log_battery_state(&bs);
237+
} else {
238+
printf("battery state not yet available\n");
239+
}
240+
}
241+
229242
#ifndef KEEP_ALIVE
230243
void test_done(void *arg) {
244+
report_battery_state();
231245
emscripten_html5_remove_all_event_listeners();
232246
exit(0);
233247
}
@@ -389,13 +403,7 @@ int main() {
389403
ret = emscripten_set_batterylevelchange_callback(0, battery_callback);
390404
TEST_RESULT(emscripten_set_batterylevelchange_callback);
391405

392-
EmscriptenBatteryEvent bs;
393-
ret = emscripten_get_battery_status(&bs);
394-
TEST_RESULT(emscripten_get_battery_status);
395-
if (ret == EMSCRIPTEN_RESULT_SUCCESS) {
396-
printf("Current battery status:\n");
397-
battery_callback(EMSCRIPTEN_EVENT_BATTERYLEVELCHANGE, &bs, 0);
398-
}
406+
report_battery_state();
399407

400408
ret = emscripten_set_webglcontextlost_callback("#canvas", 0, 1, webglcontext_callback);
401409
ASSERT_RESULT(emscripten_set_webglcontextlost_callback);

0 commit comments

Comments
 (0)