NoScript っぽいもの

Opera ユーザスクリプトの話。
ちょい、NoScript っぽいものを作成中

基本方針

Operaの不満点

Operaはいろいろとカスタマイズが効く。サイト単位で制御が効いてすばらしいと思う。

が、JavaScriptの実行許可では不満点がある。

それは、不許可にすると、ブックマークレットやショートカットにGo to page, "javascript:...."としたようなものも動かなくなってしまう点。これは大変困る。

仕方ないので、デフォルト許可にしているわけだが、やはり余計なスクリプトが動作したりとウザったい。

Opera独自イベントリスナ

ブックマークを漁ってたら、こんなのが出てきた。

BeforeScript
SCRIPT 要素が実行される前に発生します。script 要素は UserJSEvent の element プロパティとして利用できます。スクリプトの内容は script 要素の text プロパティとして利用できます。また、その内容は次のように書き換えることもできます。UserJSEvent.element.text = UserJSEvent.element.text.replace(/!=\s*null/,''); BeforeScript イベントは外部スクリプトと同様にインラインスクリプトに対しても発生します。これには Opera が通常実行できない VBScript などといったスクリプトも含まれます。キャンセルされた場合、script 要素は実行されません。
Opera: ユーザー JavaScript にて使用可能なメソッドとイベント

素晴らしいじゃないですか!!

window.opera.addEventListener("BeforeScript", function(aEvent) {
  var src = aEvent.element.src;
  // <script src="..."> などと外部jsファイルを呼びだしている要素
  if (src) {
    // ...
  }
  // <script><!-- ... --></script>などとインラインスクリプトの要素
  else {
    // ...
  }
  aEvent.preventDefault();
}, true);

スクリプト要素の実行はブロックできる。

そいで、JavaScript URLはスクリプト要素じゃないのでサイト毎、またはグローバルの設定に依存。
基本的にグローバル設定でJavaScriptを許可してユーザスクリプトスクリプトをブロックすれば、快適ライフが送れるはず。

現状のスクリプト

現状まだまだだけど、概ね満足。本当はサイト毎の設定データはローカルストレージなどに保存した方が良いかもしれない。

ちょい解説
  • blockDomainsドメインを書く
    • プロパティdefaultに真偽値で、スクリプトをブロックするかどうかを書く
    • プロパティlistに外部スクリプトのURLを判定する正規表現を配列書く(オプション)
      • defaulttrueなら、list内にマッチしたものは実行する
      • defaultfalseなら、list内にマッチしたものは実行しない
    • インラインスクリプトdefaultで判定される
      • trueなら実行しない
      • falseなら実行
  • スクリプトを動作させたいサイトがあった時
    • Dragonflyを開いてコンソールを出す
    • ページをリロードすると外部スクリプトのURL等が出力されるので、それを元に許可設定を書く。