Google Chrome 拡張機能の開発 - 7 - これまでの内容を整理

<font color="#ff0000"><b>現在製作中の拡張機能の説明と、Chrome拡張機能での特定の手段の実現方法の説明がごっちゃになっています。すみません。</b></font>
# マニフェストファイル
まず、最低限これだけで動作するはずです。

```json:manifest.json
{
  "name": "R Chrome Extension",
  "manifest_version": 2,
  "version": "1.0",
  "browser_action": {
    "default_popup": "popup.html"
  },
}
```

もし、公開する場合には次の点に注意が必要そうです。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/54f0f001-f553-07b8-c6d9-40473fb0a5fa.png)

①：説明用のスクリーンショットです。マニフェストファイルとは関係ないのと無くても公開可能です。デベロッパーダッシュボードでのアイテム編集で変更します。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/985b01b7-158a-e6a4-f718-38f3a835d7e1.png)

②：こちらの表示がマニフェストファイルで`description`の設定を行った場合に表示されます。もし指定しなかった場合、デベロッパーダッシュボードでのアイテム編集の詳細説明で設定した内容から表示されますので、指定した方がよさそうです。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/db03ba77-590d-fba3-b830-77ecb2ea0bad.png)

```json:manifest.json
  "description": "コピー＆ペーストに関わる作業を効率化するための機能を盛り込んだツールです。（としていく予定）",
```

③：バージョン番号ですが、とても重要です。バージョン番号は 0.0.0.0 の形式で、厳密にチェックされるようなので、最初に"1.0"などで公開してしまうと、少なくとも次のバージョンは"1.0.0.1"からとなります。自分の場合、まだβのつもりでしたので、ここでやらかしました。

後はアイコン等の指定ですが、これはまだ自分としてはどうでもいいので触れていません。

# ブラウザアクションとページアクション
基本となる動作として、アイコンをクリックした際に何かを動作させるにあたり、それをブラウザアクションとするかページアクションとするかですが、特定のページ専用とするつもりでなければブラウザアクションでよいと考えています。
また、そもそもバックグラウンド等しか使わないつもりなら、この定義もしなくてよいみたいです。
当初はできるところからはじめていたので、ブラウザアクションを用意していましたが、なくしてもよさそうな感じです。

# データの保存について
HTML5の`localStorage`を利用するか、`chrome.storageAPI`を使うかになると思います。
`chrome.storageAPI`を利用すれば、Chromeを通じてどこでも保存したデータが利用できますが、処理が非同期で動作するため注意が必要なことや、制約等もあるようです。
自分の今の環境だけで十分であれば、`localStorage`でもよいかもしれません。

`localStorage`は次の記事で使用した例があります。
[Google Chrome 拡張機能の開発 - 3 - 保存できるようにする - Qiita](http://qiita.com/rrryutaro/items/4b996b4594e3fafcc77d)

以降は`chrome.storageAPI`を使用しています。

```js:localStorageでの保存
//保存
localStorage.setItem(key, val);
//読み込み
hoge = localStorage.getItem(key);

//保存(JSON)
localStorage.setItem(key, JSON.stringify(val));
//読込(JSON)
hoge = JSON.parse(localStorage.getItem(key));
```
```js:chrome.storageAPIでの保存
//保存
chrome.storage.sync.set({
  key: val
});
//読込み
chrome.storage.sync.get([key], val=>{
  console.log(val.key);
});
```

# バックグラウンドページ
バックグラウンドページを用意すると、拡張機能が有効になっている場合、常に動作しているため、余計なことをすると重くなったりなどする可能性があるので注意が必要そうです。そのため、イベントページを使うことを推奨されているようですが、現在製作中の拡張機能は、すべてのページのすべての状況下でインテリジェントなコピーを行いたいので、バックグラウンドページを利用しています。

基本はコンテキストメニューを表示させるだけです。

```js:background.js
chrome.contextMenus.create({title: "親メニュー", id: "parentMenu", contexts: ["all"]});
chrome.contextMenus.create({title: "子メニュー", parentId: "parentMenu", contexts: ["all"], onclick: info=>{
  console.log("ほげ");
}});
```

`contexts`に"all"を指定しているので、コンテキストメニューの表示が行えれば、どの場所でもメニューが表示されるはずです。
また、htmlにはテキストエリアを用意して、コレをコピペ用に利用しています。

```html:background.html
<body>
<textarea id="text" />
</body>
```

# コンテンツスクリプト
マニフェストで指定した対象のページにスクリプトを埋め込むので、色々と出来るかと思います。
現在製作中の拡張機能は、カーソル位置にある情報を取得したいので、そのようなスクリプトを埋め込んでいます。
これについては、まだjQueryなりの経験不足で、あまり良いやり方ができていません。

# オプションページ
オプションページなのでオプション設定を行うべきですが、現状はクリップボードの履歴を表示しています。

# 各処理間の連携について
いくつか方法があるみたいですが、次のようにしています。

バックグラウンド → コンテンツスクリプト

```js:background.js
chrome.tabs.getSelected(null, tab=>{
  chrome.tabs.sendRequest(tab.id, {command: "Hoge"}, response=>{
    console.log(response);
  });
});
```
```js:contentscripts.js
chrome.extension.onRequest.addListener((request, sender, sendResponse)=>{
  if (request.command === "Hoge"){
    sendResponse({"responseMessage": "ほげ");
  }
});
```

他 → バックグラウンドページに定義した関数呼び出し

```js:background.js
var logHoge = val=>{ console.log(val); };
```
```js:options.js
chrome.extension.getBackgroundPage().logHoge("ほげ");
```

# 現時点での使用感
ソースコードのコピーなどは、カーソル位置によってその行だけだったり全体を取れたりなどしているため、いまひとつな使い勝手です。
タグ要素をたどったり等や、サイト別に調整したりなどでより自然にコピーが行えるようにはなるかと思います。
その他のタグはまだIMGだけ対処しているのと、タイトルコピーはブラウザアクションでのコピーとは扱いが違うので、少々ややこしかったりしています。
何気に複数PC間でクリップボードのやり取りが行えるのも便利だったりします。
既存のものを使う方がもっと便利かもしれませんが、これからさらに拡張していけば、ちゃんと公開しても良いかもなんて考えています。


以上

|前回|一覧|次回|
|:--|:--:|--:|
|[クリップボード履歴を一応それらしく使えるようにする](http://qiita.com/rrryutaro/items/990923b40c62a4caba4c)|[シリーズ一覧](http://qiita.com/rrryutaro/items/015b67568ddd947ec2b5)|[(2017年12月)1年ぶりなのでもう一度はじめの一歩](https://qiita.com/rrryutaro/items/e6b98a0354d67c481a93)|