Operaでユーザースクリプトのみを有効にする(Disable script編)

  • Disable script
  • ページで読み込まれるスクリプトを全てはじき、スクリプトを無効化しているのと同等の状態で表示するようになります
  • ujsenabledで始まる関数のみが実行されます

ユーザーJavaScriptだけ使いたいのですが – Opera-PukiWikiPlus!

んなばかな、と思いつつリンク先のを見てみたが・・・なーるM。これ考えた人すごいわ。しかも2005年て。

解説

イベントハンドラのBeforeExternalScript、BeforeScript、BeforeJavascriptURL、BeforeEventListenerに対してe.preventDefault()を設定することで、以下の方法によるJavaScriptの実行を阻止している。

  • javascript: 形式
  • script要素からsrcで外部スクリプトを呼び出す
  • script要素に直接コードを埋め込む
  • addEventListenerを使ってclick等から実行させる

基本的にwebページ上でJavaScriptを実行するということは、上記4通りのいずれかになるので、常にJavaScriptがOFFとなる。

で、ユーザースクリプトはこれら4通り以外の領域で実行されるので、問題無く動作するというわけだ。

問題点1 一部のユーザースクリプトが動作しなくなる

スクリプトの都合上、上記の4通りの方法のうちいずれかを取っているものは当然動作しなくなる。

そこで、回避策としてイベントリスナーとして関数名にujsenabledを含んでいるもののみ実行を許可するようにされているので、そのようなスクリプトは書き換えが必要になる。

問題点2 ホワイトリストの作成が面倒

基本的にブラウザ側のJavaScriptを有効にして使うことになり、結果として全てのページのページ側で用意されたJavaScriptが問答無用で無効になる。取捨選択は行われないので、手作業でホワイトリストを追加しなければならないのが面倒。

例えばdel.icio.usでJavaScriptを有効にしたいのなら、以下のようにdisable-script.js内に記述する必要がある。

// @include http://del.icio.us/
if( document.location != "http://del.icio.us/" )

// @include http://del.icio.us/*
if( document.location.indexOf( "http://del.icio.us/" ) != 0 )

// @include del.icio.us
if( !document.location.match( "del.icio.us" ) )

感想

ホワイトリスト追加は容易なので個人的に問題ではないが、ユーザースクリプトを一部修正しなければいけないのがなんとも微妙。

だが、手法が面白いので応用して何かできないか思案中。

参考