āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻĨāĻŽ āĻā§āϝāĻžāĻŦ āĻŽā§āϝāĻžāύā§āĻāĻžāϰ āϤā§āϰāĻŋ āĻāϰā§āύāĨ¤
āĻāĻāĻžāϰāĻāĻŋāĻ
āĻāĻ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞāĻāĻŋ āĻāĻĒāύāĻžāϰ Chrome āĻāĻā§āϏāĻā§āύāĻļāύ āĻāĻŦāĻ Chrome āĻāϝāĻŧā§āĻŦ āϏā§āĻā§āϰ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻā§āϝāĻžāĻŦāĻā§āϞāĻŋāĻā§ āϏāĻāĻāĻ āĻŋāϤ āĻāϰāϤ⧠āĻāĻāĻāĻŋ āĻā§āϝāĻžāĻŦ āĻŽā§āϝāĻžāύā§āĻāĻžāϰ āϤā§āϰāĻŋ āĻāϰā§ā§ˇ

āĻāĻ āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻžāϤā§, āĻāĻŽāϰāĻž āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤāĻā§āϞāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāϰāϤ⧠āĻšāĻŦā§ āϤāĻž āĻŦā§āϝāĻžāĻā§āϝāĻž āĻāϰāϤ⧠āϝāĻžāĻā§āĻāĻŋ:
- āĻ ā§āϝāĻžāĻāĻļāύ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻāĻŋ āĻāĻā§āϏāĻā§āύāĻļāύ āĻĒāĻĒāĻāĻĒ āϤā§āϰāĻŋ āĻāϰā§āύāĨ¤
- Tabs API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻā§āϝāĻžāĻŦā§āϰ āĻāύā§āϝ āĻā§āϝā§āϝāĻŧāĻžāϰā§āĨ¤
- āϏāĻāĻā§āϰā§āĻŖ āĻšā§āϏā§āĻ āĻ āύā§āĻŽāϤāĻŋāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻā§āĻĒāύā§āϝāĻŧāϤāĻž āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§āύāĨ¤
- āĻā§āϝāĻžāĻŦā§āϰ āĻĢā§āĻāĻžāϏ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§āύāĨ¤
- āĻāĻāĻ āĻāĻāύā§āĻĄā§āϤ⧠āĻā§āϝāĻžāĻŦāĻā§āϞāĻŋ āϏāϰāĻžāύ āĻāĻŦāĻ āϤāĻžāĻĻā§āϰ āĻā§āώā§āĻ ā§āĻŦāĻĻā§āϧ āĻāϰā§āύāĨ¤
- TabGroups API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻā§āϝāĻžāĻŦ āĻā§āϰā§āĻĒā§āϰ āύāĻžāĻŽ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§āύāĨ¤
āĻāĻĒāύāĻŋ āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāĻā§
āĻāĻ āĻāĻžāĻāĻĄāĻāĻŋ āϧāϰ⧠āύā§āϝāĻŧ āϝ⧠āĻāĻĒāύāĻžāϰ āĻāĻžāĻā§ āĻŽā§āϞāĻŋāĻ āĻāϝāĻŧā§āĻŦ āĻĄā§āĻā§āϞāĻĒāĻŽā§āύā§āĻ āĻ āĻāĻŋāĻā§āĻāϤāĻž āĻāĻā§āĨ¤ āĻāĻā§āϏāĻā§āύāĻļāύ āĻĄā§āĻā§āϞāĻĒāĻŽā§āύā§āĻ āĻāϝāĻŧāĻžāϰā§āĻāĻĢā§āϞ⧠āĻĒāϰāĻŋāĻāĻŋāϤāĻŋāϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āĻšā§āϝāĻžāϞ⧠āĻāϝāĻŧāĻžāϰā§āϞā§āĻĄ āĻā§āĻ āĻāϰāĻžāϰ āĻĒāϰāĻžāĻŽāϰā§āĻļ āĻĻāĻŋāĻāĨ¤
āĻāĻā§āϏāĻā§āύāĻļāύ āϤā§āϰāĻŋ āĻāϰā§āύ
āĻļā§āϰ⧠āĻāϰāϤā§, āĻāĻā§āϏāĻā§āύāĻļāύā§āϰ āĻĢāĻžāĻāϞāĻā§āϞāĻŋāĻā§ āϧāϰ⧠āϰāĻžāĻāϤ⧠tabs-manager
āύāĻžāĻŽā§ āĻāĻāĻāĻŋ āύāϤā§āύ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋ āϤā§āϰāĻŋ āĻāϰā§āύāĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻĒāĻāύā§āĻĻ āĻāϰā§āύ, āĻāĻĒāύāĻŋ GitHub- āĻ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āϏā§āϰā§āϏ āĻā§āĻĄ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āϧāĻžāĻĒ 1: āĻāĻā§āϏāĻā§āύāĻļāύ āĻĄā§āĻāĻž āĻāĻŦāĻ āĻāĻāĻāύ āϝā§āĻ āĻāϰā§āύ
manifest.json
āύāĻžāĻŽā§ āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰā§āύ āĻāĻŦāĻ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻā§āĻĄ āϝā§āĻ āĻāϰā§āύ:
{
"manifest_version": 3,
"name": "Tab Manager for Chrome Dev Docs",
"version": "1.0",
"icons": {
"16": "images/icon-16.png",
"32": "images/icon-32.png",
"48": "images/icon-48.png",
"128": "images/icon-128.png"
}
}
āĻāĻ āĻŽā§āϝāĻžāύāĻŋāĻĢā§āϏā§āĻ āĻā§āĻā§āϞāĻŋ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻāĻžāύāϤā§, āĻĒāĻĄāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞāĻāĻŋ āĻĻā§āĻā§āύ āϝāĻž āĻāĻā§āϏāĻā§āύāĻļāύā§āϰ āĻŽā§āĻāĻžāĻĄā§āĻāĻž āĻāĻŦāĻ āĻāĻāĻāύāĻā§āϞāĻŋāĻā§ āĻāϰāĻ āĻŦāĻŋāĻļāĻĻā§ āĻŦā§āϝāĻžāĻā§āϝāĻž āĻāϰā§ā§ˇ
āĻāĻāĻāĻŋ images
āĻĢā§āϞā§āĻĄāĻžāϰ āϤā§āϰāĻŋ āĻāϰā§āύ āϤāĻžāϰāĻĒāϰ āĻāϤ⧠āĻāĻāĻāύ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰā§āύ āĨ¤
āϧāĻžāĻĒ 2: āĻĒāĻĒāĻāĻĒ āϤā§āϰāĻŋ āĻāϰā§āύ āĻāĻŦāĻ āϏā§āĻāĻžāĻāϞ āĻāϰā§āύ
āĻ
ā§āϝāĻžāĻāĻļāύ API āĻāĻā§āϏāĻā§āύāĻļāύ āĻ
ā§āϝāĻžāĻāĻļāύ (āĻā§āϞāĻŦāĻžāϰ āĻāĻāĻāύ) āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻāϰā§āĨ¤ āϝāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻāĻā§āϏāĻā§āύāĻļāύ āĻ
ā§āϝāĻžāĻāĻļāύ⧠āĻā§āϞāĻŋāĻ āĻāϰā§āύ, āϤāĻāύ āĻāĻāĻŋ āĻšāϝāĻŧ āĻāĻŋāĻā§ āĻā§āĻĄ āĻāĻžāϞāĻžāĻŦā§ āĻŦāĻž āĻāĻāĻāĻŋ āĻĒāĻĒāĻāĻĒ āĻā§āϞāĻŦā§, āϝā§āĻŽāύ āĻāĻ āĻā§āώā§āϤā§āϰā§āĨ¤ manifest.json
āĻ āĻĒāĻĒāĻāĻĒ āĻā§āώāĻŖāĻž āĻāϰ⧠āĻļā§āϰ⧠āĻāϰā§āύ:
{
"action": {
"default_popup": "popup.html"
}
}
āĻāĻāĻāĻŋ āĻĒāĻĒāĻāĻĒ āĻāĻāĻāĻŋ āĻŦā§āϝāϤāĻŋāĻā§āϰāĻŽ āϏāĻš āĻāĻāĻāĻŋ āĻāϝāĻŧā§āĻŦ āĻĒā§āώā§āĻ āĻžāϰ āĻ
āύā§āϰā§āĻĒ: āĻāĻāĻŋ āĻāύāϞāĻžāĻāύ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰ⧠āύāĻžāĨ¤ āĻāĻāĻāĻŋ popup.html
āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰā§āύ āĻāĻŦāĻ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻā§āĻĄ āϝā§āĻ āĻāϰā§āύ:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="./popup.css" />
</head>
<body>
<template id="li_template">
<li>
<a>
<h3 class="title">Tab Title</h3>
<p class="pathname">Tab Pathname</p>
</a>
</li>
</template>
<h1>Google Dev Docs</h1>
<button>Group Tabs</button>
<ul></ul>
<script src="./popup.js" type="module"></script>
</body>
</html>
āĻāϰ āĻĒāϰā§, āĻāĻĒāύāĻŋ āĻĒāĻĒāĻāĻĒ āϏā§āĻāĻžāĻāϞ āĻāϰāĻŦā§āύāĨ¤ āĻāĻāĻāĻŋ popup.css
āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰā§āύ āĻāĻŦāĻ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻā§āĻĄ āϝā§āĻ āĻāϰā§āύ:
body {
width: 20rem;
}
ul {
list-style-type: none;
padding-inline-start: 0;
margin: 1rem 0;
}
li {
padding: 0.25rem;
}
li:nth-child(odd) {
background: #80808030;
}
li:nth-child(even) {
background: #ffffff;
}
h3,
p {
margin: 0;
}
āϧāĻžāĻĒ 3: āĻā§āϝāĻžāĻŦāĻā§āϞāĻŋ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύ
āĻā§āϝāĻžāĻŦāϏ āĻāĻĒāĻŋāĻāĻ āĻāĻāĻāĻŋ āĻāĻā§āϏāĻā§āύāĻļāύāĻā§ āĻŦā§āϰāĻžāĻāĻāĻžāϰ⧠āĻā§āϝāĻžāĻŦ āϤā§āϰāĻŋ, āĻ āύā§āϏāύā§āϧāĻžāύ, āϏāĻāĻļā§āϧāύ āĻāĻŦāĻ āĻĒā§āύāϰā§āĻŦāĻŋāύā§āϝāĻžāϏ āĻāϰāĻžāϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧāĨ¤
āĻ āύā§āĻŽāϤāĻŋāϰ āĻ āύā§āϰā§āϧ āĻāϰā§āύ
āĻā§āϝāĻžāĻŦ āĻāĻĒāĻŋāĻāĻ-āĻāϰ āĻ
āύā§āĻ āĻĒāĻĻā§āϧāϤāĻŋ āĻā§āύ⧠āĻ
āύā§āĻŽāϤāĻŋāϰ āĻ
āύā§āϰā§āϧ āĻāĻžāĻĄāĻŧāĻžāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻāĻŽāĻžāĻĻā§āϰ āĻā§āϝāĻžāĻŦāĻā§āϞāĻŋāϰ title
āĻāĻŦāĻ URL
āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻšāĻŦā§; āĻāĻ āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻ
āύā§āĻŽāϤāĻŋ āĻĒā§āϰāϝāĻŧā§āĻāύ. āĻāĻŽāϰāĻž "tabs"
āĻ
āύā§āĻŽāϤāĻŋāϰ āĻ
āύā§āϰā§āϧ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ, āϤāĻŦā§ āĻāĻāĻŋ āϏāĻŽāϏā§āϤ āĻā§āϝāĻžāĻŦā§āϰ āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋāϤ⧠āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻĻā§āĻŦā§ā§ˇ āϝā§āĻšā§āϤ⧠āĻāĻŽāϰāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϏāĻžāĻāĻā§āϰ āĻā§āϝāĻžāĻŦ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāĻāĻŋ, āϤāĻžāĻ āĻāĻŽāϰāĻž āϏāĻāĻā§āϰā§āĻŖ āĻšā§āϏā§āĻ āĻ
āύā§āĻŽāϤāĻŋāϰ āĻāύā§āϝ āĻ
āύā§āϰā§āϧ āĻāϰāĻŦāĨ¤
āϏāĻāĻā§āϰā§āĻŖ āĻšā§āϏā§āĻā§āϰ āĻ
āύā§āĻŽāϤāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϏāĻžāĻāĻāĻā§āϞāĻŋāϤ⧠āĻāĻā§āĻāϤāϰ āĻ
āύā§āĻŽāϤāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻā§āĻĒāύā§āϝāĻŧāϤāĻž āϰāĻā§āώāĻž āĻāϰāϤ⧠āĻĻā§āϝāĻŧ⧎ āĻāĻāĻŋ title
, āĻāĻŦāĻ URL
āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋāϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻ
āϤāĻŋāϰāĻŋāĻā§āϤ āĻā§āώāĻŽāϤāĻžāĻā§āϞāĻŋāϤ⧠āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻŽāĻā§āĻā§āϰ āĻāϰāĻŦā§ā§ˇ manifest.json
āĻĢāĻžāĻāϞ⧠āĻšāĻžāĻāϞāĻžāĻāĻ āĻāϰāĻž āĻā§āĻĄ āϝā§āĻ āĻāϰā§āύ:
{
"host_permissions": [
"https://developer.chrome.com/*"
]
}
đĄ āĻā§āϝāĻžāĻŦ āĻ āύā§āĻŽāϤāĻŋ āĻāĻŦāĻ āĻšā§āϏā§āĻ āĻ āύā§āĻŽāϤāĻŋ āĻŽāϧā§āϝ⧠āĻĒā§āϰāϧāĻžāύ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻāĻŋ āĻāĻŋ?
"tabs"
āĻ
āύā§āĻŽāϤāĻŋ āĻāĻŦāĻ āĻšā§āϏā§āĻ āĻ
āύā§āĻŽāϤāĻŋ āĻāĻāϝāĻŧā§āϰāĻ āϤā§āϰā§āĻāĻŋ āϰāϝāĻŧā§āĻā§āĨ¤
"tabs"
āĻ
āύā§āĻŽāϤāĻŋ āĻāĻāĻāĻŋ āĻāĻā§āϏāĻā§āύāĻļāύāĻā§ āϏāĻŽāϏā§āϤ āĻā§āϝāĻžāĻŦā§ āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻĄā§āĻāĻž āĻĒāĻĄāĻŧāĻžāϰ āĻā§āώāĻŽāϤāĻž āĻĻā§āϝāĻŧ⧎ āϏāĻŽāϝāĻŧā§āϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§, āĻāĻ āϤāĻĨā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻŦā§āϰāĻžāĻāĻāĻŋāĻ āĻāϤāĻŋāĻšāĻžāϏ āϏāĻāĻā§āϰāĻš āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝā§āĻŽāύ, āĻāĻĒāύāĻŋ āĻāĻ āĻ
āύā§āĻŽāϤāĻŋāϰ āĻ
āύā§āϰā§āϧ āĻāϰāϞ⧠Chrome āĻāύāϏā§āĻāϞā§āϰ āϏāĻŽāϝāĻŧ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āϏāϤāϰā§āĻāϤāĻž āĻŦāĻžāϰā§āϤāĻž āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰāĻŦā§:
āĻšā§āϏā§āĻā§āϰ āĻ āύā§āĻŽāϤāĻŋāĻā§āϞāĻŋ āĻāĻāĻāĻŋ āĻāĻā§āϏāĻā§āύāĻļāύāĻā§ āĻāĻāĻāĻŋ āĻŽā§āϝāĻžāĻāĻŋāĻ āĻā§āϝāĻžāĻŦā§āϰ āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋ āĻĒāĻĄāĻŧāϤ⧠āĻāĻŦāĻ āĻ āύā§āϏāύā§āϧāĻžāύ āĻāϰāĻžāϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧ āĻāĻŦāĻ āĻāĻ āĻā§āϝāĻžāĻŦā§ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻā§āϞāĻŋ āĻāύāĻā§āĻā§āĻ āĻāϰā§ā§ˇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰāĻž āĻāύāϏā§āĻāϞ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āϏāϤāϰā§āĻāϤāĻž āĻŦāĻžāϰā§āϤāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āύ:
āĻāĻ āϏāϤāϰā§āĻāϤāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāύā§āϝ āĻāĻĻā§āĻŦā§āĻāĻāύāĻ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻāĻāĻŋ āĻāĻžāϞ āĻ āύāĻŦā§āϰā§āĻĄāĻŋāĻ āĻ āĻāĻŋāĻā§āĻāϤāĻžāϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž āĻāĻā§āĻāĻŋāĻ āĻ āύā§āĻŽāϤāĻŋ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰāĻžāϰ āϏā§āĻĒāĻžāϰāĻŋāĻļ āĻāϰāĻŋ⧎
āĻā§āϝāĻžāĻŦ āĻāĻŋāĻā§āĻāĻžāϏāĻž
āĻāĻĒāύāĻŋ tabs.query()
āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ URL āĻĨā§āĻā§ āĻā§āϝāĻžāĻŦāĻā§āϞāĻŋ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻāĻāĻŋ popup.js
āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰā§āύ āĻāĻŦāĻ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻā§āĻĄ āϝā§āĻ āĻāϰā§āύ:
const tabs = await chrome.tabs.query({
url: [
"https://developer.chrome.com/docs/webstore/*",
"https://developer.chrome.com/docs/extensions/*",
]
});
đĄ āĻāĻŽāĻŋ āĻāĻŋ āϏāϰāĻžāϏāϰāĻŋ āĻĒāĻĒāĻāĻĒā§ Chrome API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ?
āĻāĻāĻāĻŋ āĻĒāĻĒāĻāĻĒ āĻāĻŦāĻ āĻ
āύā§āϝāĻžāύā§āϝ āĻāĻā§āϏāĻā§āύāĻļāύ āĻĒā§āώā§āĻ āĻžāĻā§āϞāĻŋ āϝ⧠āĻā§āύāĻ āĻā§āϰā§āĻŽ āĻāĻĒāĻŋāĻāĻāĻā§ āĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻāĻžāϰāĻŖ āϏā§āĻā§āϞāĻŋ āĻā§āϰā§āĻŽ āϏā§āĻāĻŋāĻŽāĻž āĻĨā§āĻā§ āĻĒāϰāĻŋāĻŦā§āĻļāĻŋāϤ āĻšāϝāĻŧ⧎ āϝā§āĻŽāύ chrome-extension://EXTENSION_ID/popup.html
āĨ¤
āĻāĻāĻāĻŋ āĻā§āϝāĻžāĻŦā§ āĻĢā§āĻāĻžāϏ āĻāϰā§āύ
āĻĒā§āϰāĻĨāĻŽāϤ, āĻāĻā§āϏāĻā§āύāĻļāύāĻāĻŋ āĻā§āϝāĻžāĻŦā§āϰ āύāĻžāĻŽāĻā§āϞāĻŋ (āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ HTML āĻĒā§āώā§āĻ āĻžāĻā§āϞāĻŋāϰ āĻļāĻŋāϰā§āύāĻžāĻŽ) āĻŦāϰā§āĻŖāĻžāύā§āĻā§āϰāĻŽāĻŋāĻāĻāĻžāĻŦā§ āϏāĻžāĻāĻžāϤ⧠āĻšāĻŦā§ā§ˇ āϤāĻžāϰāĻĒāϰ, āϝāĻāύ āĻāĻāĻāĻŋ āϤāĻžāϞāĻŋāĻāĻž āĻāĻāĻā§āĻŽ āĻā§āϞāĻŋāĻ āĻāϰāĻž āĻšāϝāĻŧ, āĻāĻāĻŋ tabs.update()
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏā§āĻ āĻā§āϝāĻžāĻŦā§ āĻĢā§āĻāĻžāϏ āĻāϰāĻŦā§ āĻāĻŦāĻ windows.update()
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāύā§āĻĄā§āĻāĻŋāĻā§ āϏāĻžāĻŽāύ⧠āύāĻŋāϝāĻŧā§ āĻāϏāĻŦā§āĨ¤ popup.js
āĻĢāĻžāĻāϞ⧠āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻā§āĻĄ āϝā§āĻ āĻāϰā§āύ:
...
const collator = new Intl.Collator();
tabs.sort((a, b) => collator.compare(a.title, b.title));
const template = document.getElementById("li_template");
const elements = new Set();
for (const tab of tabs) {
const element = template.content.firstElementChild.cloneNode(true);
const title = tab.title.split("-")[0].trim();
const pathname = new URL(tab.url).pathname.slice("/docs".length);
element.querySelector(".title").textContent = title;
element.querySelector(".pathname").textContent = pathname;
element.querySelector("a").addEventListener("click", async () => {
// need to focus window as well as the active tab
await chrome.tabs.update(tab.id, { active: true });
await chrome.windows.update(tab.windowId, { focused: true });
});
elements.add(element);
}
document.querySelector("ul").append(...elements);
...
đĄ āĻāĻ āĻā§āĻĄā§ āĻŦā§āϝāĻŦāĻšā§āϤ āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ
- Collator āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻĒāĻāύā§āĻĻā§āϰ āĻāĻžāώāĻž āĻ āύā§āϏāĻžāϰ⧠āĻā§āϝāĻžāĻŦ āĻ ā§āϝāĻžāϰ⧠āϏāĻžāĻāĻžāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧāĨ¤
- āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāĻāĻā§āĻŽ āϤā§āϰāĻŋ āĻāϰāϤā§
document.createElement()
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻā§āϞā§āύ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠āĻāĻŽāύ āĻāĻāĻāĻŋ HTML āĻāĻĒāĻžāĻĻāĻžāύāĻā§ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻā§āĻŽāĻĒā§āϞā§āĻ āĻā§āϝāĻžāĻ āĨ¤ - āĻāĻāĻāϰāĻāϞ āĻāύāϏā§āĻā§āϰāĻžāĻā§āĻāϰ āĻāĻāĻāϰāĻāϞ āϤā§āϰāĻŋ āĻāĻŦāĻ āĻĒāĻžāϰā§āϏ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧāĨ¤
- āϏā§āĻĒā§āϰā§āĻĄ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ
append()
āĻāϞ⧠āĻāĻĒāĻžāĻĻāĻžāύā§āϰ āϏā§āĻāĻā§ āĻāϰā§āĻā§āĻŽā§āύā§āĻā§ āϰā§āĻĒāĻžāύā§āϤāϰ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧāĨ¤
āĻā§āϝāĻžāĻŦ āĻā§āϰā§āĻĒ āĻāϰā§āύ
TabGroups API āĻāĻā§āϏāĻā§āύāĻļāύāĻā§ āĻā§āϰā§āĻĒā§āϰ āύāĻžāĻŽ āĻĻāĻŋāϤ⧠āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻĒāĻāĻā§āĻŽāĻŋāϰ āϰāĻ āĻŦā§āĻā§ āύā§āĻāϝāĻŧāĻžāϰ āĻ
āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧāĨ¤ āĻšāĻžāĻāϞāĻžāĻāĻ āĻāϰāĻž āĻā§āĻĄ āϝā§āĻ āĻāϰ⧠āĻŽā§āϝāĻžāύāĻŋāĻĢā§āϏā§āĻā§ "tabGroups"
āĻ
āύā§āĻŽāϤāĻŋ āϝā§āĻ āĻāϰā§āύ:
{
"permissions": [
"tabGroups"
]
}
popup.js
āĻ, āĻāĻāĻāĻŋ āĻŦā§āϤāĻžāĻŽ āϤā§āϰāĻŋ āĻāϰāϤ⧠āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻā§āĻĄāĻāĻŋ āϝā§āĻ āĻāϰā§āύ āϝāĻž tabs.group()
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻŽāϏā§āϤ āĻā§āϝāĻžāĻŦāĻā§ āĻā§āώā§āĻ ā§āĻŦāĻĻā§āϧ āĻāϰāĻŦā§ āĻāĻŦāĻ āϤāĻžāĻĻā§āϰ āĻŦāϰā§āϤāĻŽāĻžāύ āĻāĻāύā§āĻĄā§āϤ⧠āύāĻŋāϝāĻŧā§ āϝāĻžāĻŦā§āĨ¤
const button = document.querySelector("button");
button.addEventListener("click", async () => {
const tabIds = tabs.map(({ id }) => id);
if (tabIds.length) {
const group = await chrome.tabs.group({ tabIds });
await chrome.tabGroups.update(group, { title: "DOCS" });
}
});
āĻāĻāĻŋ āĻāĻžāĻ āĻāϰ⧠āϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰā§āύ
āϝāĻžāĻāĻžāĻ āĻāϰā§āύ āϝ⧠āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻĢāĻžāĻāϞ āĻāĻžāĻ āĻžāĻŽā§ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋ āĻāĻžāĻā§āϰ āϏāĻžāĻĨā§ āĻŽā§āϞā§:
āϏā§āĻĨāĻžāύā§āϝāĻŧāĻāĻžāĻŦā§ āĻāĻĒāύāĻžāϰ āĻāĻā§āϏāĻā§āύāĻļāύ āϞā§āĻĄ āĻāϰā§āύ
āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻŽā§āĻĄā§ āĻāĻāĻāĻŋ āĻāύāĻĒā§āϝāĻžāĻ āĻāϰāĻž āĻāĻā§āϏāĻā§āύāĻļāύ āϞā§āĻĄ āĻāϰāϤā§, Hello World- āĻāϰ āϧāĻžāĻĒāĻā§āϞāĻŋ āĻ āύā§āϏāϰāĻŖ āĻāϰā§āύ⧎
āĻāϝāĻŧā§āĻāĻāĻŋ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĒā§āĻ āĻā§āϞā§āύ
āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻāύā§āĻĄā§āϤ⧠āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āύāĻĨāĻŋ āĻā§āϞā§āύ:
- āĻāĻāĻāĻžāϰ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻĄāĻŋāĻāĻžāĻāύ āĻāϰā§āύ
- Chrome āĻāϝāĻŧā§āĻŦ āĻĻā§āĻāĻžāύ⧠āĻāĻŦāĻŋāώā§āĻāĻžāϰ
- āĻāĻā§āϏāĻā§āύāĻļāύ āĻāύā§āύāϝāĻŧāύ āĻāĻāĻžāϰāĻāĻŋāĻ
- āĻŽā§āϝāĻžāύāĻŋāĻĢā§āϏā§āĻ āĻĢāĻžāĻāϞ āĻĢāϰāĻŽā§āϝāĻžāĻ
- Chrome āĻāϝāĻŧā§āĻŦ āĻĻā§āĻāĻžāύ⧠āĻĒā§āϰāĻāĻžāĻļ āĻāϰā§āύ⧎
āĻĒāĻĒāĻāĻĒ āĻā§āϞāĻŋāĻ āĻāϰā§āύ. āĻāĻāĻŋ āĻāĻ āĻŽāϤ āĻšāĻāϝāĻŧāĻž āĻāĻāĻŋāϤ:

"āĻā§āϰā§āĻĒ āĻā§āϝāĻžāĻŦ" āĻŦā§āϤāĻžāĻŽā§ āĻā§āϞāĻŋāĻ āĻāϰā§āύāĨ¤ āĻāĻāĻŋ āĻāĻ āĻŽāϤ āĻšāĻāϝāĻŧāĻž āĻāĻāĻŋāϤ:

đ¯ āϏāĻŽā§āĻāĻžāĻŦā§āϝ āĻāύā§āύāϤāĻŋ
āĻāĻĒāύāĻŋ āĻāĻ āϝāĻž āĻļāĻŋāĻā§āĻā§āύ āϤāĻžāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰā§, āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āϝā§āĻā§āύāĻāĻŋ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰā§āύ:
- āĻĒāĻĒāĻāĻĒ āϏā§āĻāĻžāĻāϞ āĻļā§āĻ āĻāĻžāϏā§āĻāĻŽāĻžāĻāĻ āĻāϰā§āύāĨ¤
- āĻā§āϝāĻžāĻŦ āĻā§āϰā§āĻĒā§āϰ āϰāĻ āĻāĻŦāĻ āĻļāĻŋāϰā§āύāĻžāĻŽ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§āύāĨ¤
- āĻ āύā§āϝ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āϏāĻžāĻāĻā§āϰ āĻā§āϝāĻžāĻŦ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύāĨ¤
- āĻā§āώā§āĻ ā§āĻŦāĻĻā§āϧ āĻā§āϝāĻžāĻŦāĻā§āϞāĻŋāĻā§ āĻā§āώā§āĻ ā§āĻŦāĻĻā§āϧ āĻāϰāĻžāϰ āĻāύā§āϝ āϏāĻŽāϰā§āĻĨāύ āϝā§āĻ āĻāϰā§āύāĨ¤
āύāĻŋāϰā§āĻŽāĻžāĻŖ āϰāĻžāĻā§āύ!
āĻāĻ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞāĻāĻŋ āĻļā§āώ āĻāϰāĻžāϰ āĻāύā§āϝ āĻ āĻāĻŋāύāύā§āĻĻāύ đāĨ¤ āĻāĻ āϏāĻŋāϰāĻŋāĻā§āϰ āĻ āύā§āϝāĻžāύā§āϝ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞāĻā§āϞāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāϰ⧠āĻāĻĒāύāĻžāϰ āĻĻāĻā§āώāϤāĻž āĻŦāĻŋāĻāĻžāĻļ āĻāĻžāϞāĻŋāϝāĻŧā§ āϝāĻžāύ:
āĻāĻā§āϏāĻā§āύāĻļāύ | āϝāĻž āĻļāĻŋāĻāĻŦā§āύ |
---|---|
āĻĒāĻĄāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ | āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻĒā§āώā§āĻ āĻžāϝāĻŧ āĻāĻāĻāĻŋ āĻāĻĒāĻžāĻĻāĻžāύ āϏāύā§āύāĻŋāĻŦā§āĻļ āĻāϰāĻžāύāĨ¤ |
āĻĢā§āĻāĻžāϏ āĻŽā§āĻĄ | āĻāĻā§āϏāĻā§āύāĻļāύ āĻ ā§āϝāĻžāĻāĻļāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāĻžāϰ āĻĒāϰ āĻŦāϰā§āϤāĻŽāĻžāύ āĻĒā§āώā§āĻ āĻžāϝāĻŧ āĻā§āĻĄ āĻāĻžāϞāĻžāύā§āϰ āĻāύā§āϝāĨ¤ |
āĻ āύā§āĻŦā§āώāĻŖ āĻāĻžāϞāĻŋāϝāĻŧā§ āϝāĻžāύ
āĻāĻŽāϰāĻž āĻāĻļāĻž āĻāϰāĻŋ āĻāĻĒāύāĻŋ āĻāĻ āĻā§āϰā§āĻŽ āĻāĻā§āϏāĻā§āύāĻļāύāĻāĻŋ āϤā§āϰāĻŋ āĻāϰāĻž āĻāĻĒāĻā§āĻ āĻāϰā§āĻā§āύ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻā§āϰā§āĻŽ āĻĄā§āĻā§āϞāĻĒāĻŽā§āύā§āĻ āĻļā§āĻāĻžāϰ āϝāĻžāϤā§āϰāĻž āĻāĻžāϞāĻŋāϝāĻŧā§ āϝā§āϤ⧠āĻāϤā§āϤā§āĻāĻŋāϤ⧎ āĻāĻŽāϰāĻž āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻļāĻŋāĻā§āώāĻžāϰ āĻĒāĻĨāĻāĻŋ āϏā§āĻĒāĻžāϰāĻŋāĻļ āĻāϰāĻŋ:
- āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰā§āϰ āĻāĻžāĻāĻĄā§ āĻāύā§āύāϤ āĻāĻā§āϏāĻā§āύāĻļāύ āϤā§āϰāĻŋāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻžāϏāĻā§āĻāĻŋāĻ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύā§āϰ āĻā§āĻāϰā§āĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāϝāĻŧā§āĻ āĻĄāĻāύ āĻ āϤāĻŋāϰāĻŋāĻā§āϤ āϞāĻŋāĻā§āĻ āϰāϝāĻŧā§āĻā§ā§ˇ
- āĻā§āϞāĻž āĻāϝāĻŧā§āĻŦā§ āϝāĻž āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāϝāĻŧ āϤāĻžāϰ āĻŦāĻžāĻāϰā§āĻ āĻāĻā§āϏāĻā§āύāĻļāύāĻā§āϞāĻŋāϰ āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠APIāĻā§āϞāĻŋāϤ⧠āĻ ā§āϝāĻžāĻā§āϏā§āϏ āϰāϝāĻŧā§āĻā§ā§ˇ Chrome API-āĻāϰ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĒā§āϰāϤāĻŋāĻāĻŋ API-āĻāϰ āĻŽāϧā§āϝ āĻĻāĻŋāϝāĻŧā§ āĻāϞā§āĨ¤