ブラウザ拡張のOpen Withに、Ctrl+クリックで開く機能を追加したけどPRしなかった話

公開:2021/02/22
更新:2021/03/01
2 min読了の目安(約2600字TECH技術記事

Chromeでブラウザ拡張のOpen Withを使用しているのですが、リンクを開く時はコンテキストメニューを開く必要があり使いにくさがありました。
そこでCtrl+クリックやマウスの中央ボタンクリックで開けるようにしたのですが、権限が増えるのでプルリクするのは諦めてローカルで使用することにました。

供養のため記事にしました。

※javascriptは雰囲気で触ってます。

リポジトリ

chromeウェブストアにリンクはありませんが、リポジトリは https://github.com/darktrojan/openwith 見たいです。

masterブランチchromeブランチがあるようです。

chromeウェブストアのバージョンはは7.2.1でしたが、masterブランチはバージョン7.2.5、chromeブランチは7.2.2の模様です。

chromeでブランチが分かれている理由がよくわかりませんが、とりあえずchromeブランチをcheckoutします。

クリックをフックするやり方の調査

コンテンツスクリプトであればクリックイベントを拾えますが、そうすると権限を増やす必要があります。
機能上全てのURLで有効にする必要があるので、ブラウザ拡張の要求する権限が大幅に増えることになります。

webNavigationとか眺めてもリンクを開くと時のユーザーアクションを判定する方法が無さそうなので、諦めてコンテンツスクリプトを使用することにしました。
(この時点でプルリクするのは諦めました。)

コード

manifest.jsonに宣言を足します。

"content_scripts": [
    {
    "matches": ["http://*/*","https://*/*"],
    "all_frames": true,
    "js": ["content-script.js"]
    }
],

Open WithはNatime Messagingを使用していますが、コンテンツスクリプトからは呼び出せない(chrome.runtime.connectNativeが見つからない)のでbackground.jsに投げます。

content-script.js
document.addEventListener('click', function (e) {
	if (e.target.href && e.ctrlKey) {
		e.stopImmediatePropagation();
		e.preventDefault();
		console.log(e.type, e);
		chrome.extension.sendMessage(e.target.href);
		return;
	}
});
/*
// 中央ボタンクリックはとりあえず無効
document.addEventListener('auxclick', function (e) {
	if (e.target.href && e.which == 2) {
		chrome.extension.sendMessage(e.target.href);
		e.stopImmediatePropagation();
		e.preventDefault();
		console.log(e.type, e);
		return false;
	}
});
*/

受け取ったbackground.jsでは登録されているのブラウザの先頭を指定して、既存の関数を呼び出します。

background.js
chrome.extension.onMessage.addListener(function(data, sender) {
    if (data.length > 0) {
        open_browser(browsers[0].id, data);
    }
});

オプション画面でクリックしたときのブラウザを選べるようにしても良かったのですが、自分しか使用しないためしないため手を抜きました。

Open With固有のローカルインストール

chrome://extensions/で[パッケージ化されていない拡張機能を読み込む]でローカルリポジトリからインストールすると、Firefox向けの宣言で怒られます。

下記を消します。

"applications": {
    "gecko": {
        "id": "openwith@darktrojan.net",
        "strict_min_version": "63.0"
    }
},

あとは

You'll need to update your host file and reinstall it: find and replace cogjlncmljjnjpbgppagklanlcbchlno with the ID shown on the Extensions page.

とあるので、.pyのallowed_extensionsallowed_originsに、chrome://extensions/で表示されているIDを足して、open_with_windows.py installします。