diff --git a/packages/permission-controller/src/SubjectMetadataController.test.ts b/packages/permission-controller/src/SubjectMetadataController.test.ts index 6c23a93819..c1756926c1 100644 --- a/packages/permission-controller/src/SubjectMetadataController.test.ts +++ b/packages/permission-controller/src/SubjectMetadataController.test.ts @@ -280,4 +280,66 @@ describe('SubjectMetadataController', () => { }); }); }); + + describe('controller actions', () => { + it(':getSubjectMetadata returns the subject metadata', () => { + const [messenger, hasPermissionsSpy] = + getSubjectMetadataControllerMessenger(); + const controller = new SubjectMetadataController({ + messenger, + subjectCacheLimit: 100, + }); + hasPermissionsSpy.mockImplementationOnce(() => true); + + controller.addSubjectMetadata( + getSubjectMetadata('foo.com', 'foo', SubjectType.Snap), + ); + + controller.addSubjectMetadata( + getSubjectMetadata('bar.io', 'bar', SubjectType.Website), + ); + + expect( + messenger.call( + 'SubjectMetadataController:getSubjectMetadata', + 'foo.com', + ), + ).toStrictEqual(getSubjectMetadata('foo.com', 'foo', SubjectType.Snap)); + + expect( + messenger.call( + 'SubjectMetadataController:getSubjectMetadata', + 'bar.io', + ), + ).toStrictEqual(getSubjectMetadata('bar.io', 'bar', SubjectType.Website)); + }); + + it(':addSubjectMetadata adds passed subject metadata', () => { + const [messenger, hasPermissionsSpy] = + getSubjectMetadataControllerMessenger(); + const controller = new SubjectMetadataController({ + messenger, + subjectCacheLimit: 100, + }); + hasPermissionsSpy.mockImplementationOnce(() => true); + + messenger.call( + 'SubjectMetadataController:addSubjectMetadata', + getSubjectMetadata('foo.com', 'foo', SubjectType.Snap), + ); + + messenger.call( + 'SubjectMetadataController:addSubjectMetadata', + getSubjectMetadata('bar.io', 'bar', SubjectType.Website), + ); + + expect(controller.getSubjectMetadata('foo.com')).toStrictEqual( + getSubjectMetadata('foo.com', 'foo', SubjectType.Snap), + ); + + expect(controller.getSubjectMetadata('bar.io')).toStrictEqual( + getSubjectMetadata('bar.io', 'bar', SubjectType.Website), + ); + }); + }); }); diff --git a/packages/permission-controller/src/SubjectMetadataController.ts b/packages/permission-controller/src/SubjectMetadataController.ts index e37039243f..ab363e5327 100644 --- a/packages/permission-controller/src/SubjectMetadataController.ts +++ b/packages/permission-controller/src/SubjectMetadataController.ts @@ -66,9 +66,15 @@ export type GetSubjectMetadata = { handler: (origin: SubjectOrigin) => SubjectMetadata | undefined; }; +export type AddSubjectMetadata = { + type: `${typeof controllerName}:addSubjectMetadata`; + handler: (metadata: SubjectMetadataToAdd) => void; +}; + export type SubjectMetadataControllerActions = | GetSubjectMetadataState - | GetSubjectMetadata; + | GetSubjectMetadata + | AddSubjectMetadata; export type SubjectMetadataStateChange = ControllerStateChangeEvent< typeof controllerName, @@ -140,6 +146,11 @@ export class SubjectMetadataController extends BaseController< `${this.name}:getSubjectMetadata`, this.getSubjectMetadata.bind(this), ); + + this.messagingSystem.registerActionHandler( + `${this.name}:addSubjectMetadata`, + this.addSubjectMetadata.bind(this), + ); } /**