Firefox の拡張機能、 Copy URL + について質問です。


拡張機能のこと自体は 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 + 自体の情報はある程度知っていますので、入手先や解説ページの紹介は不要です。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2006/10/12 20:08:10
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:mhrs No.2

回答回数21ベストアンサー獲得回数8

ポイント300pt

最初の回答では後方互換性確保の為に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;
}

当該箇所をこの様に書換えてみてください。

id:hxxk

同じ回答者ですので、まとめてコメントを。

まず、「copyurlplusOverlay.js での function getCurrentLink() の条件式で else と判断されて」というのは書き方を間違えていました。判断されて、というよりも「『 else と判断されたかのように』空の値しか返ってきていませんが、やり方が悪いのかソースにパッチをあてるべきなのかの判断が私にはできていません」と書くべきでした。

(実際、だったらソースを書きかえれいいじゃないかという指摘を某所でもらいました。)

で、このパッチを適用してみると無事 %RLINK% の値を取得することができました ! ありがとうございます。

というか、この質問をしたきっかけが http://d.hatena.ne.jp/mhrs/20061006/p1 だったんですよね。「完璧にニーズを満たすわけじゃないけど Copy URL + の %RLINK% でどうにかなるんじゃないかなー」と思って試してみたら「あれ、 %RLINK% の値が返ってこないぞ ????? 」ということで、まずはそこを解決しないと、ということで質問をしたら、 Copy URL + でどうでしょうと語りかけるはずの本人からパッチの提供があったという。

2006/10/12 20:06:27

その他の回答1件)

id:mhrs No.1

回答回数21ベストアンサー獲得回数8

ポイント200pt

拡張機能の改造方法は御存じとの前提で回答します。

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もメソッドからプロパティに変更されたものと思います。

id:mhrs No.2

回答回数21ベストアンサー獲得回数8ここでベストアンサー

ポイント300pt

最初の回答では後方互換性確保の為に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;
}

当該箇所をこの様に書換えてみてください。

id:hxxk

同じ回答者ですので、まとめてコメントを。

まず、「copyurlplusOverlay.js での function getCurrentLink() の条件式で else と判断されて」というのは書き方を間違えていました。判断されて、というよりも「『 else と判断されたかのように』空の値しか返ってきていませんが、やり方が悪いのかソースにパッチをあてるべきなのかの判断が私にはできていません」と書くべきでした。

(実際、だったらソースを書きかえれいいじゃないかという指摘を某所でもらいました。)

で、このパッチを適用してみると無事 %RLINK% の値を取得することができました ! ありがとうございます。

というか、この質問をしたきっかけが http://d.hatena.ne.jp/mhrs/20061006/p1 だったんですよね。「完璧にニーズを満たすわけじゃないけど Copy URL + の %RLINK% でどうにかなるんじゃないかなー」と思って試してみたら「あれ、 %RLINK% の値が返ってこないぞ ????? 」ということで、まずはそこを解決しないと、ということで質問をしたら、 Copy URL + でどうでしょうと語りかけるはずの本人からパッチの提供があったという。

2006/10/12 20:06:27
  • id:mhrs
    「&&」が「&&」になっていますね。スーパーpre記法でちゃんと書いたはずなんだけど。お手数をお掛けしますが「&」を適宜「&」に修正して使ってください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません