新米エンジニアの失敗再発防止メモ

自分そしてこの世界の皆が、同じ失敗をしないためのメモ

Twitterやってます!@rakuton_t
欲しいものリストのブタメンを送ってくれた方、ありがとうございます!

Chromeの拡張機能を開発して詰まったところ

昨日、初めてChrome拡張機能を公開申請しました。
現在は審査中です。
審査が通ったら改めて公開した拡張機能について記事を書きます。

審査が通りました。
【Chrome拡張機能】「Black List Site」を公開しました。 - 新米エンジニアの失敗再発防止メモ

コンソールが3つある

・background.js のコンソール
・popup.html・popup.js(ポップアップ)のコンソール
・content.js(開いているページ)のコンソール
の3つがあります。
F12で開けるコンソールは上記のうちcontent.jsの出力しか確認できません。
ポップアップのコンソールは、ポップアップを右クリックし、「検証」をクリックすることで開くことができます。
background.jsのコンソールは、chrome://extensions/ を開き、「バックグラウンドページ」をクリックすることで開くことができます。

onclickが使えない

<input id="entry" type="button" value="登録" onclick="func();">

とかやると、ポリシー違反で以下のようなエラーが表示されます。

Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self' blob: filesystem: chrome-extension-resource:". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.


同様に、onBlur, onChange, onClick, onFocus, onSelect, onSubmit などその他、on~系のは大体使えません。
下記のように、面倒くさがらずにリスナーを使いましょう。

background.js

document.addEventListener('DOMContentLoaded', function() {
	var entryElement = document.getElementById('entry');
	entryElement.addEventListener('click', function() {
                 //何かしらの処理
	});
});

ストレージの共有範囲

ストレージは、2種類ありますね。
・各種ブラウザで標準で使えるlocalStorage
chrome独自で用意しているchrome.storage

今回私が使ったのはchrome.storageなので、こちらについて説明しますね。
localStorageでも同じなんですが、chrome.storageは、ブラウザにデータを保存するデータベースのようなものです。

popup.js と background.jsのストレージ範囲は共有
content.js のストレージは上記2つと共有しない。
よって、content.jsに値を渡したい時はmessageを使うこと

例えば、
1. popup.jsで何かしらのデータを入力して登録
2. 何かしらのページを開いたときに、1で入力したデータを参照して何かしらの処理を実行する

のようなことをしたい時は、
1. popup.jsでストレージに入力データを登録
2. background.jsで、ページが開かれた時にchrome.tabs.sendMessageでcontent.jsにデータを送る
3. content.jsで、2で送られてきたデータを受け取る

のようにする必要があります。

「2. background.jsで、ページが開かれた時にchrome.tabs.sendMessageでcontent.jsにデータを送る」
これは以下のようにして実現できます。

background.js

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
	chrome.storage.sync.get(['data'], function(result) {
	  chrome.tabs.sendMessage(tabId, {"data": result.data});
	});
});

chrome.storage.sync.get」は、ストレージからデータを取り出す非同期な処理です。
ストレージにデータを保存する処理は、「chrome.storage.sync.set」を使います。
詳しくは公式ドキュメントをご覧ください。簡単です。
chrome.storage - Google Chrome

chrome.tabs.onUpdated.addListener」は、タブの更新を検知するリスナーです。


「3. content.jsで、2で送られてきたデータを受け取る」
これは以下のようにして実現できます。

var data = '';
chrome.runtime.onMessage.addListener(
	function(request, sender, sendResponse) {
                data =  request.data;
                // dataを使った何らかの処理
	}
);

chrome.runtime.onMessage.addListener」は、メッセージの受信を検知するリスナーです。
これも当然、非同期なので、受信したデータを利用した処理をするなら、このスコープの中に書いた方がタイミングで困りません。

私の記事が役に立ったら、どうぞ何か買ってください!→ Amazon欲しいものリスト