Skip to content

Commit dd1a57b

Browse files
Fix up pr feedback
1 parent 5ded1ba commit dd1a57b

File tree

1 file changed

+37
-19
lines changed

1 file changed

+37
-19
lines changed

injected/src/features/web-compat.js

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,28 @@ export class WebCompat extends ContentFeature {
274274
});
275275
}
276276

277+
/**
278+
* Handles permission query with native messaging support.
279+
* @param {Object} query - The permission query object
280+
* @param {Object} settings - The permission settings
281+
* @returns {Promise<PermissionStatus|null>} - Returns PermissionStatus if handled, null to fall through
282+
*/
283+
async handlePermissionQuery(query, settings) {
284+
if (!query?.name || !settings?.supportedPermissions?.[query.name]?.native) {
285+
return null;
286+
}
287+
288+
try {
289+
const permSetting = settings.supportedPermissions[query.name];
290+
const returnName = permSetting.name || query.name;
291+
const response = await this.messaging.request(MSG_PERMISSIONS_QUERY, query);
292+
const returnStatus = response.state || 'prompt';
293+
return new PermissionStatus(returnName, returnStatus);
294+
} catch (err) {
295+
return null; // Fall through to original method
296+
}
297+
}
298+
277299
permissionsPresentFix(settings) {
278300
const originalQuery = window.navigator.permissions.query;
279301
window.navigator.permissions.query = new Proxy(originalQuery, {
@@ -283,16 +305,10 @@ export class WebCompat extends ContentFeature {
283305
// Let the original method handle validation and exceptions
284306
const query = args[0];
285307

286-
// Only intercept if we have settings and the permission is configured as native
287-
if (query && query.name && settings?.supportedPermissions?.[query.name]?.native) {
288-
try {
289-
const response = await this.messaging.request(MSG_PERMISSIONS_QUERY, query);
290-
const returnStatus = response.state || 'prompt';
291-
return Promise.resolve(new PermissionStatus(query.name, returnStatus));
292-
} catch (err) {
293-
// If messaging fails, fall through to original method
294-
return Reflect.apply(target, thisArg, args);
295-
}
308+
// Try to handle with native messaging
309+
const result = await this.handlePermissionQuery(query, settings);
310+
if (result) {
311+
return result;
296312
}
297313

298314
// Fall through to original method for all other cases
@@ -315,6 +331,8 @@ export class WebCompat extends ContentFeature {
315331
permissions.query = new Proxy(
316332
async (query) => {
317333
this.addDebugFlag();
334+
335+
// Validate required arguments
318336
if (!query) {
319337
throw new TypeError("Failed to execute 'query' on 'Permissions': 1 argument required, but only 0 present.");
320338
}
@@ -328,17 +346,17 @@ export class WebCompat extends ContentFeature {
328346
`Failed to execute 'query' on 'Permissions': Failed to read the 'name' property from 'PermissionDescriptor': The provided value '${query.name}' is not a valid enum value of type PermissionName.`,
329347
);
330348
}
349+
350+
// Try to handle with native messaging
351+
const result = await this.handlePermissionQuery(query, settings);
352+
if (result) {
353+
return result;
354+
}
355+
356+
// Fall back to default behavior
331357
const permSetting = settings.supportedPermissions[query.name];
332358
const returnName = permSetting.name || query.name;
333-
let returnStatus = settings.permissionResponse || 'prompt';
334-
if (permSetting.native) {
335-
try {
336-
const response = await this.messaging.request(MSG_PERMISSIONS_QUERY, query);
337-
returnStatus = response.state || 'prompt';
338-
} catch (err) {
339-
// do nothing - keep returnStatus as-is
340-
}
341-
}
359+
const returnStatus = settings.permissionResponse || 'prompt';
342360
return Promise.resolve(new PermissionStatus(returnName, returnStatus));
343361
},
344362
{

0 commit comments

Comments
 (0)