)]}'
{
  "commit": "619b1197c4cb892f7c0ed29d4610c908d972d873",
  "tree": "a388a623e67b7ff78d32d76e49dad0a2f85ca0c6",
  "parents": [
    "dc0c4076efcce19f99e69d990b6d7d76f5dba5eb"
  ],
  "author": {
    "name": "Ben Rohlfs",
    "email": "brohlfs@google.com",
    "time": "Mon Nov 27 13:16:31 2023 +0100"
  },
  "committer": {
    "name": "Ben Rohlfs",
    "email": "brohlfs@google.com",
    "time": "Mon Dec 04 10:50:15 2023 +0100"
  },
  "message": "Migrate to Manifest V3: Migrate to a service worker\n\nWe are following these migration guides:\nhttps://developer.chrome.com/docs/extensions/migrating/to-service-workers/\nhttps://developer.chrome.com/docs/extensions/migrating/api-calls/\n\nAdding a StorageUtil class for interacting with `chrome.storage`. We are\npersisting the rules and the enabled tabs in storage. The service\nworker, the popup and the content script can all access\n`chrome.storage`, but the content script can only access\n`chrome.storage.sync`, not `.session`.\n\nRegister listeners synchronously: `setUpListeners()` and\n`removeListeners()` functions are removed. We are just always listening\nto events.\n\nPersist states: The global `Map` `TabStates` are moved to\n`chrome.storage.session`. Helper functions are added. async/await is\nadded where needed.\n\nConvert timers to alarms: Remove timer. Not needed anymore. Event\nlisteners are working just fine.\n\n`checkCurrentTab()` was re-purposed to `updateIconPopup()`. Enabling and\ndisabling a tab happens directly by calling `storage` methods. You can\nlisten to `storage` changes via `chrome.storage.onChanged`. Thus we only\nneed a function in the service worker for updating the icon and popup\nstates when either the active tab changes or when the tab is enabled or\ndisabled.\n\nRemove obsolete `isNew` property from `Rule` objects.\n\nFrom the \"Update your code\" migration guide we are just renaming\n`browser_action` to `action`.\n\nChange-Id: I583b0ff70a414c33c66781846d866e7784460011\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "1cb33dadd37b9828ff48fe4676c2ca6846497e9e",
      "old_mode": 33188,
      "old_path": "src/content_script.ts",
      "new_id": "06c6bdce220885e6c28182a56d8b9fee8374f4ef",
      "new_mode": 33188,
      "new_path": "src/content_script.ts"
    },
    {
      "type": "modify",
      "old_id": "53af6f32137714a89ee87e6b700c405a554d0e91",
      "old_mode": 33188,
      "old_path": "src/manifest.json",
      "new_id": "c196223a75d1f737145e9736e915d9dd8f824b5d",
      "new_mode": 33188,
      "new_path": "src/manifest.json"
    },
    {
      "type": "modify",
      "old_id": "be78b64fcbe5792f722a6f55d70613bc271c199b",
      "old_mode": 33188,
      "old_path": "src/popup.ts",
      "new_id": "ce4bc626e5f36bcdbb0c5359cb1354432c99dc99",
      "new_mode": 33188,
      "new_path": "src/popup.ts"
    },
    {
      "type": "modify",
      "old_id": "3e068c2a6b11141a9effc222c65cfff7424752ee",
      "old_mode": 33188,
      "old_path": "src/service_worker.ts",
      "new_id": "ae0e30f7e6667b728858dbf0ed888d2c0deb034c",
      "new_mode": 33188,
      "new_path": "src/service_worker.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "242b923e3cb9f11a111a7675d6a735c8f69dc1be",
      "new_mode": 33188,
      "new_path": "src/storage.ts"
    },
    {
      "type": "modify",
      "old_id": "b990a632bca8e2864fce3e270fa1199c32fcff4f",
      "old_mode": 33188,
      "old_path": "src/utils.ts",
      "new_id": "82263936071dcf68661a8c338812691c7ca18451",
      "new_mode": 33188,
      "new_path": "src/utils.ts"
    }
  ]
}
