Opera でソースエディタを自由に変更できるか予備実験してみた


注意:この記事は技術的な検証のため、実際に拡張機能などを公開する予定はありません。

はじめに

先日参加したOpera 夏祭り(参加報告ブログ記事)でユーザーから
「ソースエディタを自由に変更したい」
という要望がありました。

バージョン12以前のOperaにはソースエディタを変更する機能がありました。

[H27.09.02] Opera 12 ソースビューアの変更

Firefoxの設定画面にはありませんが、about:configより、view_source.editorの設定変更をすると可能なようです。

しかし、現在の Opera や同じエンジンである Chrome の拡張機能ではそのようなことはできません。

その場では、ブラウザのセキュリティ上外部のソフトウェアは実行できないのではないかという方向になりましたが、時間ができたので調べてみました。

関連する技術

設定ファイルにはそのような項目は確認できませんでしたので、拡張機能でどうにかカスタマイズできないかと思いました。

関連する拡張機能として、ダウンロード終了後プログラムで開く機能を追加する拡張機能があります。

これは、ダウンロードしたファイルに対して既定のプログラムで開くという作業なので、HTML に応用する場合既定のプログラム(=ブラウザ)でしか開くができません。

Chrome からブラウザ以外の処理を行う例として、Eject がありました。

これを応用したら行けそうな気がします。

やってみた

拡張機能のファイル構成については、実際の拡張機能を参考にしながら作成しました。

manifest.json

{
  "name": "Download Example",
  "version": "1.0",
  
  "manifest_version": 2,
  "description": "ブラウザからメモ帳を開くテスト", 
  "browser_action": {
    "default_icon": {
      "19": "icon-128.png",
      "38": "icon-128.png"
    },
    "default_title": "テスト",
    "default_popup": "main.html"
  },
  "icons": {
    "128": "icon-128.png"
  },
  "permissions": [
          "downloads",
          "downloads.open"
  ]
}

test.vbs

今回は予めbase64エンコードしてmain.jsに貼り付けています。

Option Explicit

Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")

objWshShell.Run "C:\Windows\System32\notepad.exe"

Set objWshShell = Nothing

main.html

<!DOCTYPE html>
<html>
  <head>
    <script src='./main.js'></script>
  </head>
  <body>
    <button id='down-button'>Download</button>
  </body>
</html>

main.js

URL は http:// の代わりに、
data:(MIME タイプ);base64,(Base64 エンコードした文字列)
とすることで実際に存在しないファイルをダウンロードすることができます。

Unchecked runtime.lastError while running downloads.open: User gesture required
とエラーが出るので、ダウンロードを開く前に alert を入れています。
alert 以外に回避方法があればいいのですが。

function download() {
	var url = "data:text/vbscript;base64,T3B0aW9uIEV4cGxpY2l0DQoNCkRpbSBvYmpXc2hTaGVsbA0KU2V0IG9ialdzaFNoZWxsID0gV1NjcmlwdC5DcmVhdGVPYmplY3QoIldTY3JpcHQuU2hlbGwiKQ0KDQpvYmpXc2hTaGVsbC5SdW4gIkM6XFdpbmRvd3NcU3lzdGVtMzJcbm90ZXBhZC5leGUiDQoNClNldCBvYmpXc2hTaGVsbCA9IE5vdGhpbmc=";
	chrome.downloads.download( {
		url : url,
		filename : "test.vbs",
		conflictAction : "overwrite"
	}, function ( id ){
		if( id === undefined ) return;
		alert("I am an alert box!");
		chrome.downloads.open( id );
	} );
	
}

document.addEventListener('DOMContentLoaded', function () {
  document.getElementById('down-button').addEventListener(
      'click', download);
});

これで、拡張機能のボタンを押して「Download」を押すと、VBS ファイルがダウンロードされメモ帳が開く拡張機能が完成しました。

今後の課題

この方法を応用して、ソースエディタを自由に変更する拡張機能を実現するために必要なことを挙げてみます。

  • 現在開いている URL の取得
    permissios に chrome.tabs を追加することで取得できそうです。
  • JavaScript で Base64 を生成
    URLと起動したい実行ファイルの部分は書き換えられるよう、毎回生成する必要があります
  • VBScript でファイルをダウンロード
    一つのファイルしかダウンロードできないため、VBS ファイルの方にダウンロードの処理を追加する必要があります。
  • オプション画面

これらは、既に他の拡張機能やスクリプトを参考にすると実現可能なので、難しくはないかなと思います。

問題点

Opera の設定の「ダウンロードする前にファイルの保存先を確認する」を有効にしていると、ダウンロード画面が表示されてしまいますし、そもそも手順が遠回りな気がします。

これ以外の方法として、Native Messaging という API を利用する方補もあります。

ただ、これはレジストリの変更を伴うことにより一般公開が難しいことと、JSON形式でしかデータが渡せないのでクライアント側もしっかり作る必要がありそうです。


Comments

comments

コメントを残す

メールアドレスが公開されることはありません。

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)