ExSearchBar β3

onkeyup、onkeydownのイベントが発生するようになったIEDockExの0.0.7が公式ラボに上がってたので、キー周りの機能を追加したExSearchBar β3SUECアップローダーにアップ*1した。語句入力中はキーボードに手がいってるから、サジェストリストがキーで操作可能になったのは大きいと思う。0.0.6でテストしてないのでもしかしたらIEDockExをアップデートしないと全然動かないとかあるかもしれない。
個人的にショートカット検索はショートカットの入力が面倒だったのでctrl + ショートカットでも可能にしたが、今考えるとctrl + cとかctrl + vとかと衝突してダメダメな予感orz そういう要望も例も見ないから懸念はあったけど、やはりマウス派が無理にキー操作弄るとろくな事にならない。とりあえずコピーとかペースト時は無効にしてオンオフも設定できるようにしよう。
Dock上でのホイール回転で単語検索はKIKIとかぶら。にある機能で便利そうだと思ったけど、使ってみたらそうでもなかった。何かをトリガーに本体の検索バーに文字送ってついでにSearchNextアクションを実行させる方がいろんな意味で都合が良さそう。というか自前で実装するんじゃなくてホイール回転でSearchNext、SearchPreviousを実行させたほうが良いか。そしたらDock上で一度ホイールを回す→ビュー上でホイールを回すでスムーズに操作できるし。

*1:0.0.7に気づいたのが深夜だったのでアップだけして寝た

ポップアップ辞書など非同期型SeaHorseスクリプトの修正

SaveTextAreaから使ってた、IHTMLWindow2にホストさせて@type SleipnirScriptなSeaHorseスクリプトを非同期で動かすやり方だとexecScriptの上書きでISleipnirなり他のオブジェクトなりにアクセスできるようになる可能性*1があるので、Sleipnir2スレを参考にスクリプトコントールにホストさせるようにしてみた。
ページのスクリプトを無効にしてても動く*2とかメリットもあるんだけど、デフォルトで使えるのが2k以降なのと、タブを閉じるだけでほぼ開放できて最悪でもSleipnirの終了で間違いなく開放されるIHTMLWindow2にホストさせる場合と比べてメモリリークしやすいから敬遠してたんだけど、確実に素のwindow.execScriptにアクセスする手法は思いつかなかった。この場合、非同期化自体のプロセスでは一切IHTMLWindows2にオブジェクトを渡さないしフレームを考慮しても文字列しか渡さずに済むので、処理部分で変なことしないように注意すれば問題ないはず。
execScriptを使っていたポップアップ辞書SaveTextArea、ライブラリブリッジをそれぞれ修正したが、とりあえずは問題なく動作してるみたい。SaveTextAreaは最初意図通りに開放されずに散々悩んだが、スクリプトコントロール内で生成した要素にスクリプトコントロール内の関数をアタッチしてたせいで循環参照起こしてた。基本的にイベントをアタッチしたものだけ注意を払えば大丈夫だと思うけど、はまると何が参照保持してんのかわからなくなりそう。
SaveTextAreaはそろそろ役目を終えるスクリプトだと思うけど、テキストエリアをリサイズした時の挙動とテーブル作成クエリのミスが気になってたのでついでに修正を行った。ライブラリブリッジは知ってる範囲では他に使ってる人がいないけど、とりあえず使う側から特別意識する必要があるような変更はないと思うけど、

[todo, include, ScriptName]

の部分で第4引数にtrueを追加してやるとライブラリとtodo内で_debugがtrueになるようになったのと、sleipnirを省略可能になった。あとwindowが個々のフレームを指して_windowがトップウィンドウを指す。window.topで参照できるからあんま意味ないけど。
これらの修正とは直接関係ないけど、すーぱーどらっぐあんどどろっぷ*3でうまく動作しないことがあるということなので、ドラッグ中はドラッグ開始イベントが起こらないように変えてみた。設定とかはそのままで大丈夫なはず。

*1:例によって誰が狙うんだってセキュリティホールではあるんだけど

*2:状況が状況なので利用者からすればセキュリティホール自体の修正よりこちらの方が嬉しいか

*3:ひらがな表記を正式名称にした

スーパードラッグアンドドロップ

スーパードラッグアンドドロップっぽいのを作ってみたのでラボのジャンクに置いといた。導入はともかく、カスタマイズは全く洗練されてなくてめんどくさいがあんまりやる気がないので改善する見込みは薄い。IE7 Proに付いてる機能が絶賛されてるあたり、あんまりカスタマイズが必要なものでもないのかな?と思った。そもそもテキスト選択後にググるURIとして開くくらいしかしないからこそD&Dでってのが便利なんだろうし*1
初期設定では、選択テキストを右にドロップするとGoogleで検索、左へドロップするとURIと見なして開く。画像上やリンク上での振る舞いは右図のようになる。リンクされた画像かどうかはリンク要素の直下が画像がどうかで判定してるのでそんなに厳密じゃないけど、多分大抵は期待通りに振る舞うと思う。真上や真下ならリンクされているかどうかに関わらず画像を保存するし、左なら画像かテキストリンクかに関わらずリンク先を保存する。
カスタマイズはsdadSetting.jsを弄れば一応できる。初期設定にない*2のもので、

["hogeで検索", "userAction('hoge.js')"],

みたいにすればUserAction用スクリプトhoge.jsを実行する。SearchActionCreatorで作ったスクリプトや、バーに選択したテキストをコピーみたいなSmartSearch用スクリプトを登録するのに使う。ビュー外にドロップしたときまで反応するのがうざかったのでドロップの有効距離は15〜200にしてあるが、テキストエリアでD&Dとかやると誤爆するかもしれない。

追記

改めてエントリーにするほどじゃないけどアップデートしたので。APIが使える環境ではAPI利用して新しいウィンドウを開くようにしたのと設定できる項目を増やした。開く系の動作に統一感をもたせるため、テキストのドラッグ時の動作が0.2の時と左右逆になってるので注意。
新しく増えた設定のphaseはドラッグ方向の基準点を指定する。0.5で上が基準になるので

phase: {text: 0.5, image: 0, linkedImage: 0, link: 0},

とすると、テキスト選択時の動作が左右ではなく上下になる。3つ以上登録している場合でも使えるけど多分2つの場合に左右を上下にする以外に出番はない。

*1:あくまで推測。Fxの拡張なんかは結構カスタマイズできるからまた違うのかも

*2:0.1にはあったけど

APIとかdocumentとかURLとか

API.Close(API.GetDocumentID(API.ActiveIndex));

でも動いたのですが、
このAPI定数?みたいなのが書いてあるドキュメントはどこら辺にありますでしょうか?

ここらへんのページには、書いてない気がします。
(組み込みスクリプトの場合、sleipnir.APIは使えるとは、書いてあるようです。)

Sleipnir スキン・プラグインスレッド 8th 520

ついでに上記スクリプトではSleipnirScriptとtype宣言してるのに
documentがエラーを出さずに使えるのだろう?

Developer's Blogで - griffin-stewieの日記

この辺混乱あるようなのでわかる範囲で説明。
後者のブログへは一応_windowがグローバル変数からだよ、とだけ超適当なコメントつけたけど、最初グローバルオブジェクトだから、って書くつもりだったのを確証がなかったしドキュメントにはグローバル変数としか書いてなかったらグローバル変数って変えたら、意味通んなくなってた(´・ω・`)。多分スコープチェーン*1
グローバルオブジェクト→sleipnir→_window→_document
ってなってるからってのが正しい。多分だよ。グローバルオブジェクトの外まで*2スコープチェーンが続いてるのは妙な感じがするけど。
なので、宣言していない変数hogeにアクセスしようとすると、まずグローバルオブジェクト内でhogeプロパティを探し、見つからなかったらsleipnirオブジェクトのhogeプロパティを探し、それでもなければ_windowオブジェクト内に〜という具合に参照される。件のAPIやdocumentは、未宣言の変数なためグローバルオブジェクトのプロパティに存在せず、スコープチェーンを辿ってsleipnir.APIや、_window.documentを参照されているということになる。グローバルオブジェクトがよくわからない場合は以下の二つのコードを実行してみて欲しい。

Echo(URL);//_document.URLが参照される
var URL;//宣言した変数はグローバルオブジェクトのプロパティになる
Echo(URL);//グローバルオブジェクトにURLがあるので_document.URLは参照されない

要するに、sleipnir、_window、_documentの各プロパティにはsleipnir等をつけなくてもアクセスできるということなのだけれど、sleipnirオブジェクトのプロパティは大文字小文字を区別しないのでwindow.alertにアクセスするつもりでalertってだけ書くと、優先度の高いsleipnirオブジェクトのsleipnir.Alertへアクセスしてしまう*3。あと、openやcloseは_windowオブジェクトのものが参照されるので_document.openなんかの_documentは省略できない。

*1:http://d.hatena.ne.jp/amachang/20060406/1144339901 の最後のパワポがわかりやすい

*2:書いてて思ったけどSleipnirScriptってグローバルオブジェクトに直接アクセスできない?

*3:statusの場合も同様。ただ、どっちも普通は問題ない

ExSearchBar β2

β2では、β1で頂いた動作報告からApplet版は不要と判断しAppletを廃止、ショートカット検索や拡張アイテムの機能を実装した。協力していただいた方々に感謝。ExSearchBar β2
ComboBoxを実装するのは結構面倒なのでComboBoxの場合でもListBoxと同じようにselect要素で処理してる。デフォの検索エンジンリストだと、ComboBoxにはitemが一個もないのでむしろ邪魔になるかも。優先度低いので特に要望がなければComboBoxとしての実装は大分後回しになりそう。
Dockへフォーカスを移したら設定のリロードを行うようにしてたけど、Dockにフォーカスのない状態からボタンを押そうとすると先に設定のリロードが行われてonclickイベントを起こせないので、Dockの何も無いところにフォーカスが移ったときに変更した。本当は設定画面で登録ボタンを押した時にリロードさせたいのだがうまく行かない。今のところ、Dockとビューで通信が可能なようにデータベースに専用のテーブル用意してメッセージキューのように扱うのがいいかと思う。即応性の必要が無いようなものなら他のスクリプトからもExSearchBarを経由してアクションを実行するような使い方できるし。
ひとまず需要が高そうな機能は一通り実装したから、不具合が多くなければ次の更新は少し間隔あくと思うが、そろそろ拡張機能を詰めたい*1。本体の検索バーに実装されている機能が多すぎて再現だけで結構手間どってしまった。あと他のIEDockEx用のファイルとマージしやすいように、表示したい位置にscrptタグ挿入するだけで要素を自動生成できるようにしたい。

*1:そもそもα3以降じゃ機能してないけど

ExSearchBar β1

Sleipnir 2.6.0 test5(次期正式リリース候補版)の修正、

[不具合修正]

  • Sleipnir Script を使用したとき、Sleipnir が完全に終了できないことがある不具合を修正した。(スクリプトからの参照を強制的に切断するか、

 終了をキャンセルするかを選択できるダイアログを表示します。)(タクヤ,RAPT)

http://pc11.2ch.net/test/read.cgi/win/1196867413/75

のおかげで安心してsetInterval使えるようになったので、JAVA Applet使わない方向で*1進めてみることにした。なんか試してみたらプロセス残るの再現しなくなってるから本当にIEDockExでやってもダイアログが出るかどうかはわかんないけど多分平気。
問題はサジェストリストと検索エンジン切り替えのメニュー表示だけど、こっちもつい最近window.createPopupってメソッドを知ったのでこれで対応した。検索してみるとどうもフィッシング詐欺の手口に使われたらしくて、XP SP2ではウィンドウ外に表示できないようになった、とかあるんだけど手元のXP(SP2 + IE7)だと再現しないのでよくわからない。XP SP2 + IE6な人の動作報告求む。もし環境によらずウィンドウ外に表示できるようならAppletは完全に切りたい。
修正した不具合で大きいのは、エンジン切り替えが特殊な条件下*2でしか作動しなかったもの。私の環境だとたまたま条件を満たしてたけど多分普通の環境じゃ動かなかったはず。切り替えが出来ないだけならまだしも、初期化処理が中断されるから多分開いたadapter.htmlが自動で閉じないorz

今回もファイルSUECアップローダーにアップさせてもらった。

追記

どうもXP SP2 + IE6でも大丈夫みたいです。ちなみに正常に動作してればこのようになります
サジェスト

検索エンジンメニュー

*1:だってプニル本体の起動よりこれの初期化のほうが重いのは間違ってる…

*2:アクション名が空の検索エンジンが設定してあること

ExSearchBar α3

IEDockやIEPanelへISleipnirを渡すを応用し、IEDockExを使ってExSearchBarのα3を作った。配付場所として、今回からSUECアップローダーを利用させてもらうことにした。ほとんど1から作り直してるので*1、α2より機能は減ってたりする。

スクリーンショット


フレームやページ間での同期に頭を悩ますことはなくなったけど、スクリプトだとDock外にサジェストや検索エンジンメニューを表示するのに効果的な手段がない。また、OnKeyUpイベントが取れずタイマーで監視しようにもISleipnir渡してタイマー監視やってるとSleipnirが終了しなくなる*2。そのあたりをJavaAppletで対処して、未署名のJavaAppletではセキュリティ上アクセスできないところなんかはSleipnirScriptを使って処理するようにした。URLエンコードやメニュー作成でJAVAコンポーネント使えるからソースがすっきりするかと思ったら総量は大してかわんなかった。
IEDockExを利用するので、Sleipnirのアクションを直接起動することができる。これにともなって、Sleipnirスクリプトの起動ボタンは廃止し、代わりにアクションをボタンとして登録できるようにした。Javaがまだよくわからないのもあって結構挙動が怪しいがそれなりに使えるようになったかも。

*1:というか言語変わってるけど

*2:タイマーが有効な間はプロセスがのこり続ける?