Hatena::ブログ(Diary)

Griever Twitter

2010/06/27

NoScript Modoki for storage

はてなスターOpera ネタを強要されてる気がしたのでたまには Opera ネタを書いてみる。


onload が終わるまで script 要素を無効化するだけのスクリプト

// ==UserScript==
// @name           NoScript Modoki for storage
// @namespace      http://d.hatena.ne.jp/Griever/
// @include        http://*
// @include        https://*
// @exclude        http://reader.livedoor.com/reader/*
// @exclude        http://fastladder.com/reader/*
// ==/UserScript==

(function(){
	if (!document.getElementsByTagName('head')[0].hasChildNodes())
		return;

	// icon http://opera.higeorange.com/misc/skin.html
	var ENABLE_ICON = 'Smiley Happy';
	var DISABLE_ICON = 'Smiley Cry';

	var ID = 'NSModoki';
	var JSEnable = localStorage[ID] == 'enable';
	if (!JSEnable){
		opera.addEventListener('BeforeScript', cancel, false);
		opera.addEventListener('BeforeExternalScript', cancel_ex, false);
		opera.addEventListener('AfterEvent.load', afterLoad, false);
	}

	document.addEventListener('DOMContentLoaded', function(e){
		var icon = document.createElement('div');
		icon.id = 'NSModoki-icon';
		icon.style.cssText = [
			'position:fixed;'
			,'bottom:0px;'
			,'left:0px;'
			,'z-index:2147483647;'
		].join(' ');
		if (JSEnable) {
			icon.style.content = '-o-skin("' + ENABLE_ICON + '")';
			icon.title = 'JavaScript Enable';
		} else {
			icon.style.content = '-o-skin("' + DISABLE_ICON + '")';
			icon.title = 'JavaScript Disable';
		}
		document.body.appendChild(icon);

		icon.addEventListener('click', function(e){
			if (JSEnable){
				localStorage.removeItem(ID);
				icon.style.content = '-o-skin("' + DISABLE_ICON + '")';
				icon.title = 'JavaScript Disable';
			}else{
				localStorage[ID] = 'enable';
				icon.style.content = '-o-skin("' + ENABLE_ICON + '")';
				icon.title = 'JavaScript Enable';
				location.reload();
			}
		}, false);
	}, false);


	function cancel(e){
		// 外部 .js は BeforeExternalScript に任せる
		if (e.element.src) return;
		e.preventDefault();
	}

	function cancel_ex(e){
		// Opera Unite のファイルは読み込む
		if (e.element.src.indexOf('.operaunite.com/') > 0) return;
		e.preventDefault();
	}

	function afterLoad(e){
		if (e.event.target != window) return;
		opera.removeEventListener('BeforeScript', cancel, false);
		opera.removeEventListener('BeforeExternalScript', cancel_ex, false);
		opera.removeEventListener('AfterEvent.load', afterLoad, false);
	}

})();

Opera はアイコン準備する手間が省けて良いですね。


使い方は入れるだけ。

localStorage 使ってるので ON/OFF も簡単。

BookmarkletOpera UniteAutoPagerize SITEINFO Server は使えるようになってます。

愚痴

  • Unite とか要らん

UJS Manager 使いたいだけで my.opera に登録しなきゃいかんとかアホらしい。

ローカルファイル扱いたいだけなのにサーバー化って…

AutoPagerize SITEINFO Server も Chrome みたいにバックグラウンドで動かせれば済むものなのに。


  • alert が変

alert を表示してから Ctrl + A を押すとページが選択される。…なんで?

内容をコピーしたかったらマウスで選択 or 文字の部分をクリックしてフォーカスを合わせてから Ctrl + A を押したりしないといけない。

他にも alert 表示中に Highlight next URL アクションが1度動かせるし、動かしたあとで Back すると alert 閉じた後に戻る…。

全体的に作りが結構いいかげんな感じ(ぇ


  • タイトルバーが微妙

いつからだったかタブバーとタイトルバーが統合できるようになったけど、XP の標準のタイトルバーと統合するのは変。

統合時のタイトルバーもスキンに含めちゃえば見た目の統一感も出るし、クラシックスタイルでもタイトルバー隠せるのに。

「元のサイズに戻す」で小窓化したときは専用のタイトルバー用意してるのになんで?って感じ。


その他

  • サイト別設定に「標準の設定を利用」する機能がないのは相変わらず
  • UserJS も管理放棄されてるのも相変わらず
  • Icon Creator は良いw アルファチャンネルも指定できると良いなぁー