const permissions = {
   async add(permission = [], origins = []){
      if (!origins?.length){origins = undefined};
      if (typeof permission === "string"){permission = [permission]};
      return new Promise((r, reject) => {
         chrome.permissions.request(
            {permissions: permission, origins},
            (granted) => {
               if (!granted){
                  reject("Permission not granted");
               } else {
                  r();
               }
            }
         )
      })
   },
   async remove(permission = [], origins = []){
      if (!origins?.length){origins = undefined};
      if (typeof permission === "string"){permission = [permission]};
      return new Promise((r, reject) => {
         chrome.permissions.remove(
            {permissions: permission, origins},
            (removed) => {
               if (!removed){
                  reject("Permission not removed");
               } else {
                  r();
               }
            }
         )
      })
   },
   async with(permission = [], origins = [], func){
      if (!origins?.length){origins = undefined};
      if (typeof permission === "string"){permission = [permission]};
      await new Promise((r, reject) => {
         chrome.permissions.request(
            {permissions: permission, origins},
            (granted) => {
               if (!granted){
                  reject("Permission not granted");
               } else {
                  r();
               }
            }
         )
      });
      let out = await func();
      await new Promise((r, reject) => {
         chrome.permissions.remove(
            {permissions: permission, origins},
            (removed) => {
               if (!removed){
                  reject("Permission not removed");
               } else {
                  r();
               }
            }
         )
      })
      return out;
   },
}