рдРрдХреНрдЯрд┐рд╡ рдЯреИрдм рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЯреВрд▓рдмрд╛рд░ рдЖрдЗрдХреЙрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рдореМрдЬреВрджрд╛ рдкреЗрдЬ рдХреА рд╕реНрдЯрд╛рдЗрд▓ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдПрдВ.

рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдПрдХ рдРрд╕рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ Chrome рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдФрд░ Chrome Web Store рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╡рд╛рд▓реЗ рдкреЗрдЬреЛрдВ рдХреА рд╕реНрдЯрд╛рдЗрд▓ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХреЗ.

рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ, рд╣рдо рдЖрдкрдХреЛ рдпреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдПрдВрдЧреЗ:

  • рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕реЗрд╡рд╛ рд╡рд░реНрдХрд░ рдХреЛ рдЗрд╡реЗрдВрдЯ рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯрд░ рдХреЗ рддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.
  • "activeTab" рдЕрдиреБрдорддрд┐ рдХреА рдорджрдж рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдирд┐рдЬрддрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦреЗрдВ.
  • рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЯреВрд▓рдмрд╛рд░ рдЖрдЗрдХреЙрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддрдм рдХреЛрдб рдЪрд▓рд╛рдПрдВ.
  • Scripting API рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рд╕реНрдЯрд╛рдЗрд▓ рд╢реАрдЯ рдбрд╛рд▓реЗрдВ рдФрд░ рд╣рдЯрд╛рдПрдВ.
  • рдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреАрдмреЛрд░реНрдб рд╢реЙрд░реНрдЯрдХрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ

рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ рдпрд╣ рдорд╛рдирд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡реЗрдм рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдЕрдиреБрднрд╡ рд╣реИ. рд╣рдорд╛рд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, Hello World рд▓реЗрдЦ рдкрдврд╝реЗрдВ.

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдирд╛

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, focus-mode рдирд╛рдо рдХреА рдПрдХ рдирдИ рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдмрдирд╛рдПрдВ. рдЗрд╕рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реЛрдВрдЧреА. рдЕрдЧрд░ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ GitHub рд╕реЗ рдкреВрд░рд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

рдкрд╣рд▓рд╛ рдЪрд░рдг: рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдбреЗрдЯрд╛ рдФрд░ рдЖрдЗрдХреЙрди рдЬреЛрдбрд╝рдирд╛

manifest.json рдирд╛рдо рдХреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдпрд╣ рдХреЛрдб рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ.

{
  "manifest_version": 3,
  "name": "Focus Mode",
  "description": "Enable focus mode on Chrome's official Extensions and Chrome Web Store documentation.",
  "version": "1.0",
  "icons": {
    "16": "images/icon-16.png",
    "32": "images/icon-32.png",
    "48": "images/icon-48.png",
    "128": "images/icon-128.png"
  }
}

рдЗрди рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╝реНрдпрд╛рджрд╛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, "рд╣рд░ рдЯреИрдм рдкрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдирд╛" рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рджреЗрдЦреЗрдВ. рдЗрд╕рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ metadata рдФрд░ рдЖрдЗрдХреЙрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╝реНрдпрд╛рджрд╛ рдЬрд╛рдирдХрд╛рд░реА рджреА рдЧрдИ рд╣реИ.

images рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЙрд╕рдореЗрдВ рдЖрдЗрдХреЙрди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ.

рджреВрд╕рд░рд╛ рдЪрд░рдг: рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛

рдПрдХреНрд╕рдЯреЗрдВрд╢рди, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕реЗрд╡рд╛ рд╡рд░реНрдХрдЕрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрд╡реЗрдВрдЯ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ. рд╕рд░реНрд╡рд┐рд╕ рд╡рд░реНрдХрд░, JavaScript рдХреЗ рдЦрд╛рд╕ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рд╣реЛрддреЗ рд╣реИрдВ. рдпреЗ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╝рд░реВрд░рдд рди рд╣реЛрдиреЗ рдкрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ.

manifest.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд░реНрд╡рд┐рд╕ рд╡рд░реНрдХрд░ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдХреЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ:

{
  ...
  "background": {
    "service_worker": "background.js"
  },
  ...
}

background.js рдирд╛рдо рдХреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

chrome.runtime.onInstalled.addListener(() => {
  chrome.action.setBadgeText({
    text: "OFF",
  });
});

рд╣рдорд╛рд░рд╛ рд╕реЗрд╡рд╛ рд╡рд░реНрдХрд░, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ runtime.onInstalled() рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕реБрдиреЗрдЧрд╛. рдЗрд╕ рддрд░реАрдХреЗ рд╕реЗ, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╢реБрд░реБрдЖрддреА рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рдХрд░рдиреЗ рдпрд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрдиреЗ рдкрд░ рдХреБрдЫ рдЯрд╛рд╕реНрдХ рдкреВрд░реЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ. рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╕рдЯреЗрдВрд╢рди Storage API рдФрд░ IndexedDB рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд╕рд┐рд░реНрдлрд╝ рджреЛ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ. рдЗрд╕рд▓рд┐рдП, рд╣рдо рдРрдХреНрд╢рди рдХреЗ рдмреИрдЬ рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдпрд╣ рдЯреНрд░реИрдХ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди 'рдЪрд╛рд▓реВ рд╣реИ' рдпрд╛ 'рдмрдВрдж рд╣реИ'.

рддреАрд╕рд░рд╛ рдЪрд░рдг: рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдРрдХреНрд╢рди рдЪрд╛рд▓реВ рдХрд░рдирд╛

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдРрдХреНрд╢рди, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЯреВрд▓рдмрд╛рд░ рдЖрдЗрдХреЙрди рдХреЛ рдХрдВрдЯреНрд░реЛрд▓ рдХрд░рддрд╛ рд╣реИ. рдЗрд╕рд▓рд┐рдП, рдЬрдм рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЖрдЗрдХреЙрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдЧрд╛, рддреЛ рдпрд╣ рдХреБрдЫ рдХреЛрдб рдЪрд▓рд╛рдПрдЧрд╛ (рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ) рдпрд╛ рдХреЛрдИ рдкреЙрдк-рдЕрдк рджрд┐рдЦрд╛рдПрдЧрд╛. manifest.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдРрдХреНрд╢рди рдХрд╛ рдПрд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

{
  ...
  "action": {
    "default_icon": {
      "16": "images/icon-16.png",
      "32": "images/icon-32.png",
      "48": "images/icon-48.png",
      "128": "images/icon-128.png"
    }
  },
  ...
}

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдирд┐рдЬрддрд╛ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, activeTab рдХреА рдЕрдиреБрдорддрд┐ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛

activeTab рдЕрдиреБрдорддрд┐ рд╕реЗ, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЪрд╛рд▓реВ рдЯреИрдм рдкрд░ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреА рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ. рдЗрд╕рд╕реЗ, рдореМрдЬреВрджрд╛ рдЯреИрдм рдХреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдРрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рдорд┐рд▓рддреА рд╣реИ.

рдпрд╣ рдЕрдиреБрдорддрд┐ рддрдм рдЪрд╛рд▓реВ рд╣реЛрддреА рд╣реИ, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ. рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдРрдХреНрд╢рди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ.

ЁЯТб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрд┐рди рдЕрдиреНрдп рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╕реЗ, рдореЗрд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ activeTab рдХреА рдЕрдиреБрдорддрд┐ рдЪрд╛рд▓реВ рд╣реЛрддреА рд╣реИ?

  • рдХреАрдмреЛрд░реНрдб рд╢реЙрд░реНрдЯрдХрдЯ рдХрд╛ рдХреЙрдореНрдмрд┐рдиреЗрд╢рди рджрдмрд╛рдирд╛.
  • рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдореЗрдиреНрдпреВ рдХрд╛ рдХреЛрдИ рдЖрдЗрдЯрдо рдЪреБрдирдирд╛.
  • рдСрдордиреАрдмреЙрдХреНрд╕ рд╕реЗ рдорд┐рд▓рд╛ рд╕реБрдЭрд╛рд╡ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛.
  • рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдкреЙрдк-рдЕрдк рдЦреЛрд▓рдирд╛.

"activeTab" рдЕрдиреБрдорддрд┐ рдХреА рдорджрдж рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рди-рдмреВрдЭрдХрд░ рдлрд╝реЛрдХрд╕ рдХрд┐рдП рдЧрдП рдЯреИрдм рдкрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ. рдЗрд╕рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдирд┐рдЬрддрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╣рддреА рд╣реИ. рдЗрд╕рдХрд╛ рдПрдХ рдФрд░ рдлрд╝рд╛рдпрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЕрдиреБрдорддрд┐ рд╕реЗ рдЬреБрдбрд╝реА рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рдорд┐рд▓рддреА.

"activeTab" рдЕрдиреБрдорддрд┐ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХреЗ рдЕрдиреБрдорддрд┐ рдХрд▓реЗрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

{
  ...
  "permissions": ["activeTab"],
  ...
}

рдЪреМрдерд╛ рдЪрд░рдг: рдореМрдЬреВрджрд╛ рдЯреИрдм рдХреА рд╕реНрдерд┐рддрд┐ рдЯреНрд░реИрдХ рдХрд░рдирд╛

рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдРрдХреНрд╢рди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдпрд╣ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдпреВрдЖрд░рдПрд▓, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╡рд╛рд▓реЗ рдкреЗрдЬ рд╕реЗ рдореИрдЪ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдореМрдЬреВрджрд╛ рдЯреИрдм рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рдЕрдЧрд▓реА рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛. background.js рдореЗрдВ рдпрд╣ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

const extensions = 'https://developer.chrome.com/docs/extensions';
const webstore = 'https://developer.chrome.com/docs/webstore';

chrome.action.onClicked.addListener(async (tab) => {
  if (tab.url.startsWith(extensions) || tab.url.startsWith(webstore)) {
    // Retrieve the action badge to check if the extension is 'ON' or 'OFF'
    const prevState = await chrome.action.getBadgeText({ tabId: tab.id });
    // Next state will always be the opposite
    const nextState = prevState === 'ON' ? 'OFF' : 'ON';

    // Set the action badge to the next state
    await chrome.action.setBadgeText({
      tabId: tab.id,
      text: nextState,
    });
  }
});

рдкрд╛рдВрдЪрд╡рд╛рдВ рдЪрд░рдг: рд╕реНрдЯрд╛рдЗрд▓ рд╢реАрдЯ рдЬреЛрдбрд╝рдирд╛ рдпрд╛ рд╣рдЯрд╛рдирд╛

рдЕрдм рдкреЗрдЬ рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдмрджрд▓рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ. focus-mode.css рдирд╛рдо рдХреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдпрд╣ рдХреЛрдб рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ:

* {
  display: none !important;
}

html,
body,
*:has(article),
article,
article * {
  display: revert !important;
}

[role='navigation'] {
  display: none !important;
}

article {
  margin: auto;
  max-width: 700px;
}

Scripting API рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рд╕реНрдЯрд╛рдЗрд▓ рд╢реАрдЯ рдбрд╛рд▓реЗрдВ рдпрд╛ рд╣рдЯрд╛рдПрдВ. рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдореЗрдВ "scripting" рдЕрдиреБрдорддрд┐ рдХрд╛ рдПрд▓рд╛рди рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ:

{
  ...
  "permissions": ["activeTab", "scripting"],
  ...
}

рдЖрдЦрд┐рд░ рдореЗрдВ, рдкреЗрдЬ рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, background.js рдореЗрдВ рдпрд╣ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

  ...
    if (nextState === "ON") {
      // Insert the CSS file when the user turns the extension on
      await chrome.scripting.insertCSS({
        files: ["focus-mode.css"],
        target: { tabId: tab.id },
      });
    } else if (nextState === "OFF") {
      // Remove the CSS file when the user turns the extension off
      await chrome.scripting.removeCSS({
        files: ["focus-mode.css"],
        target: { tabId: tab.id },
      });
    }
  }
});

ЁЯТб рдХреНрдпрд╛ рд╕реНрдЯрд╛рдЗрд▓ рд╢реАрдЯ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Scripting API рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╣рд╛рдВ. JavaScript рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, scripting.executeScript() рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ: рдХреАрдмреЛрд░реНрдб рд╢реЙрд░реНрдЯрдХрдЯ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛

рдлрд╝реЛрдХрд╕ рдореЛрдб рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд╛рд▓реВ рдпрд╛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢реЙрд░реНрдЯрдХрдЯ рдЬреЛрдбрд╝реЗрдВ. рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдореЗрдВ "commands" рдХреБрдВрдЬреА рдЬреЛрдбрд╝реЗрдВ.

{
  ...
  "commands": {
    "_execute_action": {
      "suggested_key": {
        "default": "Ctrl+B",
        "mac": "Command+B"
      }
    }
  }
}

"_execute_action" рдХреБрдВрдЬреА, action.onClicked() рдЗрд╡реЗрдВрдЯ рдХреЗ рдЬреИрд╕реЗ рд╣реА рдХреЛрдб рдЪрд▓рд╛рддреА рд╣реИ. рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА.

рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ

рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдлрд╝рд╛рдЗрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╣реЛ:

рдлрд╝реЛрдХрд╕ рдореЛрдб рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдХреЙрдиреНрдЯреЗрдВрдЯ: manifest.json, background.js, focus-mode.css, рдФрд░ рдЗрдореЗрдЬ рдлрд╝реЛрд▓реНрдбрд░.

рдЕрдкрдиреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╕реНрдерд╛рдиреАрдп рддреМрд░ рдкрд░ рд▓реЛрдб рдХрд░рдирд╛

рдЕрдирдкреИрдХ рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдбреЗрд╡рд▓рдкрд░ рдореЛрдб рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рддрд░реАрдХрд╛ рдЕрдкрдирд╛рдПрдВ.

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╡рд╛рд▓реЗ рдкреЗрдЬ рдкрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдкреЗрдЬ рдЦреЛрд▓реЗрдВ:

рдЗрд╕рдХреЗ рдмрд╛рдж, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдРрдХреНрд╢рди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЕрдЧрд░ рдЖрдкрдиреЗ рдХреАрдмреЛрд░реНрдб рд╢реЙрд░реНрдЯрдХрдЯ рд╕реЗрдЯ рдЕрдк рдХрд┐рдпрд╛ рд╣реИ, рддреЛ Ctrl + B рдпрд╛ Cmd + B рджрдмрд╛рдХрд░ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ.

рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдлрд╝реЛрдХрд╕ рдореЛрдб рдХрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдВрдж рд╣реИ
рдлрд╝реЛрдХрд╕ рдореЛрдб рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдВрдж рд╣реИ

рдЗрд╕ рдкрд░:

рдлрд╝реЛрдХрд╕ рдореЛрдб рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЪрд╛рд▓реВ рд╣реИ
рдлрд╝реЛрдХрд╕ рдореЛрдб рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЪрд╛рд▓реВ рд╣реИ

ЁЯОп рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрдзрд╛рд░

рдЖрдЬ рдЬреЛ рдХреБрдЫ рднреА рд╕реАрдЦрд╛ рд╣реИ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рдХрд╛рдо рдХрд░реЗрдВ:

  • рд╕реАрдПрд╕рдПрд╕ рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдПрдВ.
  • рдХреЛрдИ рджреВрд╕рд░рд╛ рдХреАрдмреЛрд░реНрдб рд╢реЙрд░реНрдЯрдХрдЯ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ.
  • рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдмреНрд▓реЙрдЧ рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреА рд╕рд╛рдЗрдЯ рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдмрджрд▓рдирд╛.

рдХрдореНрдпреВрдирд┐рдЯреА рдХреЛ рдмрдврд╝рд╛рддреЗ рд░рд╣реЗрдВ.

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдзрд╛рдИ ЁЯОЙ. рдЗрд╕ рд╕реАрд░реАрдЬрд╝ рдХреЗ рдЕрдиреНрдп рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдкреВрд░рд╛ рдХрд░рдХреЗ, рдЕрдкрдиреА рд╕реНрдХрд┐рд▓ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдПрдВ:

Extension рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕реАрдЦрдиреЗ рдХреЛ рдорд┐рд▓реЗрдЧрд╛
рдХрд┐рддрд╛рдм рдкрдврд╝рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп рдкреЗрдЬреЛрдВ рдХреЗ рдХрд┐рд╕реА рдЦрд╛рд╕ рд╕реЗрдЯ рдореЗрдВ, рдЕрдкрдиреЗ-рдЖрдк рдПрд▓рд┐рдореЗрдВрдЯ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП.
Tabs Manager рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЯреИрдм рдХреЛ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреЙрдк-рдЕрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП.

рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рддреЗ рд░рд╣реЗрдВ

рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ Chrome рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдиреЗ рдореЗрдВ рдордЬрд╝рд╛ рдЖрдпрд╛ рд╣реЛрдЧрд╛. рд╕рд╛рде рд╣реА, рдЖрдкрдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбреЗрд╡рд▓рдк рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдореЗрдВ рднреА рдЦреБрд╢реА рд╣реЛрдЧреА. рд╣рдорд╛рд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдпреЗ рд▓рд░реНрдирд┐рдВрдЧ рдкрд╛рде рдЕрдкрдирд╛рдПрдВ:

  • рдбреЗрд╡рд▓рдкрд░ рдЧрд╛рдЗрдб рдореЗрдВ, рдмреЗрд╣рддрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдиреЗ рд╕реЗ рдЬреБрдбрд╝реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рджрд░реНрдЬрдиреЛрдВ рд▓рд┐рдВрдХ рдореМрдЬреВрдж рд╣реИрдВ.
  • рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдкрд╛рд╕, рдУрдкрди рд╡реЗрдм рдкрд░ рдЙрдкрд▓рдмреНрдз рдПрдкреАрдЖрдИ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмреЗрд╣рддрд░ рдПрдкреАрдЖрдИ рдХрд╛ рдРрдХреНрд╕реЗрд╕ рд╣реЛрддрд╛ рд╣реИ. Chrome рдХреЗ рдПрдкреАрдЖрдИ рд╕реЗ рдЬреБрдбрд╝рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝, рд╣рд░ рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ.