拡張機能のこと自体は http://hxxk.jp/2004/10/03/0547 で自ら取り上げていたのですが、 %RLINK% によるコピーがうまくいかないことに気付きました。この記事を書いた時点でのテストではうまくいった記憶があるのですが、今使っている Firefox 1.5.0.7 と Copy URL + 1.3.2 という環境では「リンクアンカーにマウスホバーして右クリック」しても、「リンクアンカーをドラッグして右クリック」しても %RLINK% の値が取得できません。( copyurlplusOverlay.js での function getCurrentLink() の条件式で else と判断されて空の値が返され、その直前にクリップボードにコピーした内容が残ったままになっているようです。)
取得するための手順が変わったのでしょうか ? それとも私のやり方がどこか間違っているのでしょうか ?
具体的な解決策はもちろん、「試してみての結果」を書いていただくだけでも構いません。 Copy URL + 自体の情報はある程度知っていますので、入手先や解説ページの紹介は不要です。
最初の回答では後方互換性確保の為にtryとcatchを用いましたが、Adapting XUL Applications for Firefox 1.5 - MDCにて、より良いと思われる(一行で出来る)書き方を見付けました。
For overlayed context menus: the function gContextMenu.linkURL() has been renamed to gContextMenu.getLinkURL(), and linkURL is now a property. To use it in a backwards-compatible way:
url = 'getLinkURL' in gContextMenu ? gContextMenu.getLinkURL() : gContextMenu.linkURL();
この書き方に修正したのが次のパッチです(またreturn文は一個の方が分りやすいと思ったのでその様にしてあります)。
diff -u -r1.7 copyurlplusOverlay.js --- copyurlplusOverlay.js 18 Apr 2005 14:04:38 -0000 1.7 +++ copyurlplusOverlay.js 12 Oct 2006 05:55:47 -0000 @@ -164,11 +164,13 @@ * Returns the URL of the link the user right-clicked on or empty if no link */ function getCurrentLink() { + var url; if (gContextMenu && gContextMenu.onLink) { - return gContextMenu.linkURL(); + url = 'getLinkURL' in gContextMenu ? gContextMenu.getLinkURL() : gContextMenu.linkURL(); } else { - return ''; + url = ''; } + return url; } function doCopyURLPlus(mode) {
これではちょっと分りにくいので、変更後のコードも載せます。
/** * Returns the URL of the link the user right-clicked on or empty if no link */ function getCurrentLink() { var url; if (gContextMenu && gContextMenu.onLink) { url = 'getLinkURL' in gContextMenu ? gContextMenu.getLinkURL() : gContextMenu.linkURL(); } else { url = ''; } return url; }
当該箇所をこの様に書換えてみてください。
拡張機能の改造方法は御存じとの前提で回答します。
function getCurrentLink() の条件式で else と判断され
てはいないみたいです。次の変更を適用してみてください。
diff -u -r1.7 copyurlplusOverlay.js --- copyurlplusOverlay.js 18 Apr 2005 14:04:38 -0000 1.7 +++ copyurlplusOverlay.js 12 Oct 2006 05:15:32 -0000 @@ -165,7 +165,11 @@ */ function getCurrentLink() { if (gContextMenu && gContextMenu.onLink) { - return gContextMenu.linkURL(); + try { + return gContextMenu.linkURL(); + } catch (e) { + return gContextMenu.linkURL; + } } else { return ''; }
これで動くものと思います。
Mozilla-gumi Forum [One Topic All View / Re[8]: Irvineを使ってDLする方法 / Page: 2]の情報によると、過去にgContextMenuのimageURLがメソッドからプロパティに変更された
様です。おそらくですが、そのとき同時にgContextMenu.linkURL
もメソッドからプロパティに変更されたものと思います。
最初の回答では後方互換性確保の為にtryとcatchを用いましたが、Adapting XUL Applications for Firefox 1.5 - MDCにて、より良いと思われる(一行で出来る)書き方を見付けました。
For overlayed context menus: the function gContextMenu.linkURL() has been renamed to gContextMenu.getLinkURL(), and linkURL is now a property. To use it in a backwards-compatible way:
url = 'getLinkURL' in gContextMenu ? gContextMenu.getLinkURL() : gContextMenu.linkURL();
この書き方に修正したのが次のパッチです(またreturn文は一個の方が分りやすいと思ったのでその様にしてあります)。
diff -u -r1.7 copyurlplusOverlay.js --- copyurlplusOverlay.js 18 Apr 2005 14:04:38 -0000 1.7 +++ copyurlplusOverlay.js 12 Oct 2006 05:55:47 -0000 @@ -164,11 +164,13 @@ * Returns the URL of the link the user right-clicked on or empty if no link */ function getCurrentLink() { + var url; if (gContextMenu && gContextMenu.onLink) { - return gContextMenu.linkURL(); + url = 'getLinkURL' in gContextMenu ? gContextMenu.getLinkURL() : gContextMenu.linkURL(); } else { - return ''; + url = ''; } + return url; } function doCopyURLPlus(mode) {
これではちょっと分りにくいので、変更後のコードも載せます。
/** * Returns the URL of the link the user right-clicked on or empty if no link */ function getCurrentLink() { var url; if (gContextMenu && gContextMenu.onLink) { url = 'getLinkURL' in gContextMenu ? gContextMenu.getLinkURL() : gContextMenu.linkURL(); } else { url = ''; } return url; }
当該箇所をこの様に書換えてみてください。
同じ回答者ですので、まとめてコメントを。
まず、「copyurlplusOverlay.js での function getCurrentLink() の条件式で else と判断されて」というのは書き方を間違えていました。判断されて、というよりも「『 else と判断されたかのように』空の値しか返ってきていませんが、やり方が悪いのかソースにパッチをあてるべきなのかの判断が私にはできていません」と書くべきでした。
(実際、だったらソースを書きかえれいいじゃないかという指摘を某所でもらいました。)
で、このパッチを適用してみると無事 %RLINK% の値を取得することができました ! ありがとうございます。
というか、この質問をしたきっかけが http://d.hatena.ne.jp/mhrs/20061006/p1 だったんですよね。「完璧にニーズを満たすわけじゃないけど Copy URL + の %RLINK% でどうにかなるんじゃないかなー」と思って試してみたら「あれ、 %RLINK% の値が返ってこないぞ ????? 」ということで、まずはそこを解決しないと、ということで質問をしたら、 Copy URL + でどうでしょうと語りかけるはずの本人からパッチの提供があったという。
同じ回答者ですので、まとめてコメントを。
まず、「copyurlplusOverlay.js での function getCurrentLink() の条件式で else と判断されて」というのは書き方を間違えていました。判断されて、というよりも「『 else と判断されたかのように』空の値しか返ってきていませんが、やり方が悪いのかソースにパッチをあてるべきなのかの判断が私にはできていません」と書くべきでした。
(実際、だったらソースを書きかえれいいじゃないかという指摘を某所でもらいました。)
で、このパッチを適用してみると無事 %RLINK% の値を取得することができました ! ありがとうございます。
というか、この質問をしたきっかけが http://d.hatena.ne.jp/mhrs/20061006/p1 だったんですよね。「完璧にニーズを満たすわけじゃないけど Copy URL + の %RLINK% でどうにかなるんじゃないかなー」と思って試してみたら「あれ、 %RLINK% の値が返ってこないぞ ????? 」ということで、まずはそこを解決しないと、ということで質問をしたら、 Copy URL + でどうでしょうと語りかけるはずの本人からパッチの提供があったという。