src/rules/javascript/webextension-unsupported-api.js (42 lines of code) (raw):

import { REMOVED_MV2_API, UNSUPPORTED_API } from 'messages/javascript'; import { hasBrowserApi, isMV2RemovedApi } from 'schema/browser-apis'; import { isBrowserNamespace } from 'utils'; const rule = { create(context) { return { MemberExpression(node) { if ( !node.computed && node.object.object && isBrowserNamespace(node.object.object.name) ) { const namespace = node.object.property.name; const property = node.property.name; const api = `${namespace}.${property}`; const { addonMetadata, privileged } = context.settings; if (hasBrowserApi(namespace, property, addonMetadata)) { return; } if (isMV2RemovedApi(namespace, property, addonMetadata)) { context.report({ node, message: REMOVED_MV2_API.messageFormat, data: { api }, }); return; } if ( privileged && // We should not have to test with `api` but with do because we // don't support nested namespaces yet, which seems common in // existing privileged extensions. // // See: https://github.com/mozilla/addons-linter/issues/4364 (addonMetadata?.experimentApiPaths?.has(namespace) || addonMetadata?.experimentApiPaths?.has(api)) ) { return; } context.report(node, UNSUPPORTED_API.messageFormat, { api }); } }, }; }, }; export default rule; export const { create } = rule;