AutoPagerizeもwindow共有不可の問題にはやっぱり影響受けてて、そのあたりちょっと考えてみましたよ

社長が訊く

任天堂のサイトにあるゲーム製作の舞台裏紹介ページ「社長が訊く」。現行のAutoPagerizeだとscriptタグで追加されるムービーへのリンクが変なことになるので、それをどうにかするスクリプトを書いた。

おそらくgreasemonkey版のAutoPagerizeでないと動かないので悪しからず。しかも以下に示す対策も必要。

AutoPagerizeにもsharedObjectを処方

ユーザースクリプト間のwindowの共有が問題となって、minibufferやLDRizeの動作に差し障りが出るのは既出の通り。対策もまた既出。他にもReblogCommandのような双方に依存するスクリプトがあれば、記事(id:aiwendi:20111115:1321338264) tでリブログ復活 - aiwendilの日記 のようにすれば解決する。

ということで、sharedObjectが用意できている環境ならば、windowの共有自体は下のようにすれば済む。行のオフセットが5000とかやたらアホみたいな数値になっているのは、ローカルにごりごり書いたSITEINFOの分なのでお気になさらぬよう。

@@ -5255,8 +5002,6 @@ if (typeof(window.AutoPagerize) == 'undefined') {
     }
     window.AutoPagerize.launchAutoPager = launchAutoPager

+    sharedObject.AutoPagerize = window.AutoPagerize
+
     var ev = document.createEvent('Event')
     ev.initEvent('GM_AutoPagerizeLoaded', true, false)
     document.dispatchEvent(ev)

window.AutoPagerizeを全部sharedObject.AutoPagerizeに書き換えなくても、AutoPagerize側の準備が出来た時点(つまり、GM_AutoPagerizeLoadedイベントの発火直前)で、sharedObjectにもコピーを作ってやればいい、というわけ。

AutoPagerizeAPI(自分用メモを兼ねて)

で、AutoPagerizeスクリプトの連携に話は移るわけだが、今回書いたスクリプトAutoPagerizeAPIhttp://autopagerize.jottit.com/apis_(ja))を利用している。

APIs

Filters

別のGreasemonkey Scriptから、AutoPagerizeの動作の途中に処理を挟むことができる。

Filter 実行タイミング 引数 用途
addDocumentFilter 次のページを読み込んで Document 作成した完了直後で、 Document からpageElement を切り出す前であり、「さらに次のページ」の URL 取得前 htmlDoc ( GM_xmlhttpRequest で取得したソースを元に作成した Document オブジェクト), this.requestURL (次のページとして取得した URL ), this.info (使用している SITEINFO ) nextLink, pageElement の取得の補助、 SITEINFO の動的な変更など
addFilter 次のページの pageElement を挿入後 pageElement ( htmlDoc から getElementsByXPath ( this.info.pageElement , htmlDoc で切り出した) 要素の配列。要素自身だと間違われやすいがあくまで配列) 継ぎ足しした部分を他の Script から操作したい場合など
addRequestFilter 次ページ取得のリクエストを送信する直前 GM_XHR用リクエストオプション リクエストのURLやオプションを変更する
addResponseFilter 次ページ取得のレスポンス取得時 レスポンス、URL レスポンスの内容を変更する

launchAutoPager

AutoPagerizeにsitoinfoを渡して実行させることができる。

引数はsitoinfoを格納した配列。

http://autopagerize.jottit.com/apis_(ja)

window.AutoPagerize下にあるAPIなので、現状、どうしてもwindowの共有が必須になる。今回スクリプトを書くのに参考にしたhttp://userscripts.org/scripts/show/48753にしても、sharedObject.AutoPagerizeを使うように書き換えて動かしているので。

まあ、windowの共有の代替策が見つかったところで、実のところまだ問題は残っているが。